js 这种多个if的写法如何优化

发布于 2022-09-13 00:02:30 字数 434 浏览 12 评论 0

statusText(value) {
      if (value === '0') {
        return '你好'
      }
      if (value === '1') {
        return '我好'
      }
      if (value === '2') {
        return '他好'
      }
      if (value === '3') {
        return '大家好'
      }
      if (value === '4') {
        return '你不好'
      }
      if (value === '5') {
        return '我不好'
      }

像这样子的写法,如何优化到最精简,不用switch

感谢各位大哥大姐的解答,小弟感激不尽!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

凉城凉梦凉人心 2022-09-20 00:02:31

查找表。

fucntion statusText(value){
    return ['你好', '我好', '大家好', '你不好', '我不好'][value]
}
美人如玉 2022-09-20 00:02:31

@林枫 的答案已经说明一两种情况下的用法:

一种是“键”和“内容”有序的情况下,可以直接使用数组

// 这里 value 可以是数字 1,也可以是字符串 "1" 这样的
function statusText(value) {
    return ["你好", "我好", "大家好", "你不好", "我不好"][value];
}

如果有序,但有偏移,比如 "你好" 对应的不是 "0",而是 "10"(后面的顺延),可以在取值的时候算偏移

function statusText(value) {
    const index = parseInt(value) - 10;
    return ["你好", "我好", "大家好", "你不好", "我不好"][index];
}

console.log(statusText(12));

当然状态一般偏移 10 的可能性不大,但是偏移 1 是有可能的(无 0 值)。

如果是有序字母,也可以做类似的运算,这里就不举例了


接下来,要处理无序的情况,这种情况直接定义映射表对象就好,@林枫 的第 2 个答案就是

为了映射表可以多次使用,可以使用闭包(上面数组也可以这样):

const statusText = (() => {
    const table = {
        "abc": "你好",
        "cdf": "你不好",
        "xyz": "大家都好"
    };
    return key => table[key];
})();

console.log(statusText("xyz"));

接下来还要处理一个问题。我注意到问题中是使用的 === 精确相等,按这个逻辑,传入的数字 1 是不能匹配到内容的,只有字符串 "1" 才能。要做类型匹配的映射表,不能用普通的数组或者对象,需要使用 Map 对象

const statusText = (() => {
    const table = new Map(
        ["你好", "我好", "大家好", "你不好", "我不好"].map((s, i) => [`${i}`, s])
    );

    return function (value) {
        return table.get(value);
    };
})();

console.log(statusText("2"));   // 大家好
console.log(statusText(2));     // undefined
未蓝澄海的烟 2022-09-20 00:02:31

我的思路:

const statusText = (value) => {
 return ['你好','我好','他好'][value]
}
const statusText = (value) => {
 const obj = {'1':'你好','2':'我好'}
 return obj[value]
}
薄荷梦 2022-09-20 00:02:31

使用map对象来存放获取的,经常用来当字典使用。

function statusText(value){
return {'0':'你好','1':'我好','2':'他好','3':'大家好','4':'你不好','5':'我不好'}[value] || '';
}

statusText('0'); //"你好"
九歌凝 2022-09-20 00:02:31

参考ts的枚举我觉得也可以,挺有意思的,其本质还是对象

ts

enum statusText {
  NIHAO = '你好',
  WOHAO = '我好',
  TAHAO = '他好',
  DAJIAHAO = '大家好',
  NIBUHAO = '你不好',
  WOBUHAO = '我不好'
}
console.log(statusText.NIHAO)

编译后的js

var statusText;
(function (statusText) {
    statusText["NIHAO"] = "\u4F60\u597D";
    statusText["WOHAO"] = "\u6211\u597D";
    statusText["TAHAO"] = "\u4ED6\u597D";
    statusText["DAJIAHAO"] = "\u5927\u5BB6\u597D";
    statusText["NIBUHAO"] = "\u4F60\u4E0D\u597D";
    statusText["WOBUHAO"] = "\u6211\u4E0D\u597D";
})(statusText || (statusText = {}));
console.log(statusText.NIHAO);

image.png

佼人 2022-09-20 00:02:31

说简单点就是使用“策略模式”

执手闯天涯 2022-09-20 00:02:31
  1. 有序的用数组。
  2. 无序的用map。
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文