JavaScript中判断的优雅写法示例

作者:冰冰你个小可爱 时间:2024-04-10 10:43:46 

目录
  • 前言

  • 一、一元判断

    • 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 对象对判断进行了优化,不过在真正的开发过程中,我们还是要遵循 实用优先 的原则,避免过度优化。

    来源:https://juejin.cn/post/7019617215011880968

    标签:js,判断,优雅
    0
    投稿

    猜你喜欢

  • pycharm安装图文教程

    2022-01-14 08:43:42
  • PHP微信开发之查询微信精选文章

    2023-11-14 12:45:54
  • Python Matplotlib简易教程(小白教程)

    2023-12-29 05:31:57
  • 设计提升满意度

    2010-05-16 15:00:00
  • python区块及区块链的开发详解

    2023-07-05 16:26:36
  • 一步步教你用Python实现2048小游戏

    2023-02-15 20:51:29
  • Python FastAPI 多参数传递的示例详解

    2023-07-03 01:21:05
  • vue+elementUi图片上传组件使用详解

    2024-05-10 14:14:49
  • 如何从Notes中读取数据?

    2009-11-15 19:57:00
  • sql server2012附加数据库问题解决方法

    2024-01-19 19:34:28
  • Node.js学习入门

    2024-05-13 09:58:37
  • ASP用JAVASCRIPT脚本实现分页的办法

    2007-10-30 13:18:00
  • 使用php操作xml教程

    2023-06-14 03:10:45
  • Python获取江苏疫情实时数据及爬虫分析

    2022-09-19 02:12:30
  • C#Web应用程序入门经典学习笔记之二

    2024-06-05 09:28:00
  • 如何避免SQL语句中含有单引号而导致操作失败?

    2009-11-07 18:40:00
  • Webpack path与publicPath的区别详解

    2024-04-29 13:37:49
  • 配置SQL Server文件组对应不同的RAID系统

    2009-01-04 14:31:00
  • Python中extend和append的区别讲解

    2021-03-28 04:20:37
  • Python浅析迭代器Iterator的使用

    2023-11-07 12:04:25
  • asp之家 网络编程 m.aspxhome.com