JavaScript中判断的优雅写法示例

2022-04-15 0 933
目录
  • 前言
  • 一、一元判断
    • 1.1 举个例子
    • 1.2 放入 Object 中
    • 1.3 放入 Map 中
  • 二、多元判断
    • 2.1 举个例子
    • 2.2 将判断条件拼成字符串放入 Object 中
    • 2.3 将判断条件拼成字符串放入 Map 中
    • 2.4 将判断条件放入 Object 后再放入 Map 中
    • 2.5 将判断条件写成 正则 后再放入 Map 中
  • 结语

    前言

    我们在写 JavaScript 时经常遇到一些逻辑判断,可以使用 if/else 或者 switch 来实现,但是对于复杂的判断,过多的条件往往会让我们的代码变得冗长,可读性下降。故我们需要优化我们的代码,使之更优雅。

    一、一元判断

    1.1 举个例子

    我们写一个常见的 if/else 判断的函数,然后对他进行优化。

    const myFunction = (status) => {
      if (status === 1) {
        console.log("status1");
      } else if (status === 2) {
        console.log("status2");
      } else if (status === 3) {
        console.log("status3");
      }
    };
    

    1.2 放入 Object 中

    我们知道, JavaScript 的 Object 其实就是一些 键值对 的无序集合,正因如此我们可以借助其存放判断的条件。例如上述情况,判断条件是一个数字类型,后续操作也仅仅是用到了一个字符串,这时我们就可以创建一个对象,把所用到的数字和字符串分别作为 Object 的键名和对应值。

    // 将判断条件放入 Object 中
    const statusObj = {
      1: "status1",
      2: "status2",
      3: "status3",
    };
    
    // 优化后函数
    const myFunction = (status) => {
      console.log(statusObj[status]);
    };
    

    1.3 放入 Map 中

    除了原始对象以外,我们还可以使用 Map 对象。我们来看下 MDN 对其的描述:

    Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值) 都可以作为一个键或一个值。

    不难看出,Map 对象其实就是普通对象的加强版,特别是任何值都可以作为其键值对,这意味着 函数 、 正则 等也可以作为其键或值,这也就大大方便了我们将其作为判断的操作。具体关于 Map 对象的细节此处不再展开。

    // 将判断条件放入 Map 中
    const statusMap = new Map([
      [1, "status1"],
      [2, "status2"],
      [3, "status3"],
    ]);
    
    // 优化后函数
    const myFunction = (status) => {
      console.log(statusMap.get(status));
    };
    

    二、多元判断

    2.1 举个例子

    既然一元判断可以优化,那么多元判断也可以进行优化,下面是有两种判断条件的案例。

    // 举个例子
    const myFunction = (right, status) => {
      if (right === "administrator" && status === 1) {
        console.log("管理员喜欢王冰冰");
      } else if (right === "administrator" && status === 2) {
        console.log("管理员不喜欢王冰冰");
      } else if (right === "user" && status === 1) {
        console.log("用户喜欢王冰冰");
      } else if (right === "user" && status === 2) {
        console.log("用户不喜欢王冰冰");
      }
    };
    
    // 有重复情况的例子
    const myFunction = (right, status) => {
      if (right === "administrator" && status === 1) {
        console.log("管理员喜欢王冰冰");
      } else if (right === "administrator" && status === 2) {
        console.log("管理员喜欢王冰冰");
      } else if (right === "user" && status === 1) {
        console.log("用户喜欢王冰冰");
      } else if (right === "user" && status === 2) {
        console.log("用户喜欢王冰冰");
      }
    };
    

    2.2 将判断条件拼成字符串放入 Object 中

    两种情况也同样可以用 Object 进行优化。

    // 优化"例子"
    
    // 将判断条件放入 Object 中
    const actionsObj = {
      "administrator-1": "管理员喜欢王冰冰",
      "administrator-2": "管理员不喜欢王冰冰",
      "user-1": "用户喜欢王冰冰",
      "user-2": "用户不喜欢王冰冰",
    };
    
    // 优化后函数
    const myFunction = (right, status) => {
      console.log(actionsObj[`${right}-${status}`]);
    };
    
    // 可以将函数作为"value",以下几种情况类似,不再赘述?
    const actionsObj = {
      "administrator-1": () => console.log("管理员喜欢王冰冰"),
      "administrator-2": () => console.log("管理员喜欢王冰冰"),
      "user-1": () => console.log("管理员喜欢王冰冰"),
      "user-2": () => console.log("管理员喜欢王冰冰"),
    };
    
    // 优化后函数
    const myFunction = (right, status) => {
      actionsObj[`${right}-${status}`]();
    };
    
    // 优化"有重复情况的例子"
    // 可以提取公共函数,以下几种情况类似,不再赘述
    const actions = () => {
      const f1 = () => console.log("管理员喜欢王冰冰");
      const f2 = () => console.log("用户喜欢王冰冰");
    
      return {
        "administrator-1": f1,
        "administrator-2": f1,
        "user-1": f2,
        "user-2": f2,
      };
    };
    
    // 优化后函数
    const myFunction = (right, status) => {
      actions()[`${right}-${status}`]();
    };
    

    2.3 将判断条件拼成字符串放入 Map 中

    同样的,我们也可以用 Map 对象。我们把两个条件存成字符串。

    // 优化"例子"
    
    // 将判断条件放入 Map 中
    const actionsMap = new Map([
        ['administrator-1', '管理员喜欢王冰冰'],
        ['administrator-2', '管理员不喜欢王冰冰'],
        ['user-1', '用户喜欢王冰冰'],
        ['user-2', '用户不喜欢王冰冰']
    ]);
    
    // 优化后函数
    const myFunction = (right, status) => {
        console.log(actionsMap.get(`${right}-${status}`));
    };
    
    

    2.4 将判断条件放入 Object 后再放入 Map 中

    // 优化"例子"
    
    // 将判断条件放入 Map 中
    const actionsMap = new Map([
        [{ right: 'administrator', status: 1 }, () => console.log('管理员喜欢王冰冰')],
        [{ right: 'administrator', status: 2 }, () => console.log('管理员不喜欢王冰冰')],
        [{ right: 'user', status: 1 }, () => console.log('用户喜欢王冰冰')],
        [{ right: 'user', status: 2 }, () => console.log('用户不喜欢王冰冰')]
    ]);
    
    // 优化后函数
    const myFunction = (right, status) => {
        const action = [...actionsMap].filter(([e]) => (e.right === right && e.status === status));
        action.forEach(([_, index]) => index.call());
    };
    

    2.5 将判断条件写成 正则 后再放入 Map 中

    利用正则表达式可以处理相对复杂一点的情况。

    // 优化"有重复情况的例子"
    
    // 将判断条件写成 正则 后再放入 Map 中
    const actions = () => {
        const f1 = () => console.log('管理员喜欢王冰冰');
        const f2 = () => console.log('用户喜欢王冰冰');
    
        return new Map([
            [/^administrator-[1-2]/, f1],
            [/^user-[1-2]/, f2]
        ]);
    };
    
    // 优化后函数
    const myFunction = (right, status) => {
        const action = [...actions()].filter(([e]) => e.test(`${right}-${status}`));
        action.forEach(([_, index]) => index.call());
    };
    

    结语

    我们利用原生 Object 和 Map 对象对判断进行了优化,不过在真正的开发过程中,我们还是要遵循 实用优先 的原则,避免过度优化。

    到此这篇关于JavaScript中判断的优雅写法的文章就介绍到这了,更多相关JavaScript判断优雅写法内容请搜索NICE源码以前的文章或继续浏览下面的相关文章希望大家以后多多支持NICE源码!

    免责声明:
    1、本网站所有发布的源码、软件和资料均为收集各大资源网站整理而来;仅限用于学习和研究目的,您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 不得使用于非法商业用途,不得违反国家法律。否则后果自负!

    2、本站信息来自网络,版权争议与本站无关。一切关于该资源商业行为与www.niceym.com无关。
    如果您喜欢该程序,请支持正版源码、软件,购买注册,得到更好的正版服务。
    如有侵犯你版权的,请邮件与我们联系处理(邮箱:skknet@qq.com),本站将立即改正。

    NICE源码网 JavaScript JavaScript中判断的优雅写法示例 https://www.niceym.com/26117.html