ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

js中多条件对应相同返回值的优化写法

2022-04-21 20:03:25  阅读:167  来源: 互联网

标签:... 对象 month action 返回值 newOptions js options 中多


需求描述

设计一种通用的、处理多条件具有相同行为的分支结构,示例场景:根据月份返回季节,1-3月返回春天,...

分析

  • 方法1:if...else if...else 首先排除,可读性和扩展性太差
  • 方法2:switch 扩展性更好,但可读性不是太好,且switch结构的终止语句可有可没有的语法可能导致潜在的异常
  • 方法3:对象属性语法的可读性和扩展性都比较好,但是需要重复书写相同的行为

最终决定,基于方法3的对象语法做改进:

  1. 维护条件和行为使用对象数组的形式:具体行为可以使用标志符代替,方便后续直接根据标志符调用相应的行为方法

{
  行为标识符1: [条件a1,条件a2, ... ],
  行为标识符2: [条件b1,条件b2, ... ],
}

  1. 定义一个通用的转换方法,将1中的对象转换成一对一映射结构的Object对象(或者映射等类型的对象)
  2. 基于2返回的Object对象(或其他类型的对象),使用三目运算符返回相应的行为标识符或默认值

实现

以“月份——季节”举例:

// 转换方法
function transOptions(options) {
  let newOptions = {};
  for (const action in options) {
    options[action].forEach(condition => (newOptions[condition] = action));
  }
  return newOptions;
}
// 判断方法
function getSeason(month) {
  const options = {
    spring: [1,2,3],
    summer: [4,5,6],
    autumn: [7,8,9],
    winter: [10,11,12],
  }
  let newOptions = transOptions(options);
  return newOptions[month] ? newOptions[month] : handleUnexpectedMonth(month); // 意外的月份值可以调用其他方法处理
}

改进

这里的 options 可以使用 Map 类型,使得键的类型更加广泛,如数字、对象等,对于非字符串类型的条件和多元条件判定更为实用:

// 转换方法
function transOptionsMap(options) {
  let newOptions = new Map();
  for (const [action, conditions] of [...options.entries()]) {
    conditions.forEach(condition => newOptions.set(condition, action));
  }
  return newOptions;
}
// 判断方法
function getSeason(month) {
  const options = new Map([ // 1,2,3,4表示第N个季度
    [1, [1,2,3]],
    [2, [4,5,6]],
    [3, [7,8,9]],
    [4, [10,11,12]],
  ]);
  let newOptions = transOptionsMap(options);
  return options.get(month) ? options.get(month) : handleUnexpectedMonth(month); // 意外的月份值可以调用其他方法处理
}

标签:...,对象,month,action,返回值,newOptions,js,options,中多
来源: https://www.cnblogs.com/cjc917/p/16175746.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有