js if多重判断如何优化到最简?

经常碰到循环数组之后需要把某个值转换

let arr = res.data.orderinformation;
for (let i = 0; i < arr.length; i++) {
  if (arr[i].ctype == "11001") {
    arr[i].ctype = "微信支付购买";
  } else if (arr[i].ctype == "11008") {
    arr[i].ctype = "余额购买";
  } else if (arr[i].ctype == "11011") {
    arr[i].ctype = "退款到余额";
  } else if (arr[i].ctype == "11012") {
    arr[i].ctype = "优惠卷兑换";
  } else if (arr[i].ctype == "11013") {
    arr[i].ctype = "积分兑换";
  } else if (arr[i].ctype == "11014") {
    arr[i].ctype = "赠送课程";
  }

  // switch优化, 但是这样写不对, 哪里出了问题?
  //   switch (arr[i].ctype) {
  //     case "11001":
  //     arr[i].ctype = "微信支付购买";
  //     break;
  //     case "11008":
  //     arr[i].ctype = "余额购买";
  //     break;
  //     case "11011":
  //     arr[i].ctype = "退款到余额";
  //     break;
  //     case "11012":
  //     arr[i].ctype = "优惠卷兑换";
  //     break;
  //     case "11013":
  //     arr[i].ctype = "积分兑换";
  //     break;
  //     case "11014":
  //     arr[i].ctype = "赠送课程";
  //     break;
  //     default:
  //     break;
  //   } 

  // 用时间戳转成日期
  arr[i].ctime = new Date(arr[i].ctime);
  arr[i].ctime =
    arr[i].ctime.toLocaleDateString().replace(/\//g, "-") +
    " " +
    arr[i].ctime.toTimeString().substr(0, 8);
}
阅读 9.5k
3 个回答
const d = {
  '11001': '微信支付购买',
  '11008': '余额购买',
  '11011': '退款到余额',
  '11012': '优惠卷兑换',
  '11013': '积分兑换',
  '11014': '赠送课程',
};
for (let i = 0; i < arr.length; i++) {
  if (d[arr[i].ctype]) arr[i].ctype = d[arr[i].ctype];
}

在js中,switch case语句在比较的时候用的是全等
请确认arr[i].ctype是字符串"11001"还是数字11001

case其实是===,它与==是有区别的。2 == "2" 成立,但是 2 === "2" 并不成立,因为它们类型不同。另外,更好的简化方式就可以用楼上的,预先定义键值对对象,然后匹配它的键。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题