es6中使用map简化复杂条件判断操作实例详解


Posted in Javascript onFebruary 19, 2020

本文实例讲述了es6中使用map简化复杂条件判断操作。分享给大家供大家参考,具体如下:

复杂逻辑判断时需要写很多if/else,代码可读性较差,可以用es6新增的Map来简化代码

列举六种实例,逐步简化

/**
 * 按钮点击事件
 * @param {number} status 活动状态:1 开团进行中 2 开团失败 3 商品售罄 4 开团成功 5 系统取消
 */
const onButtonClick = (status) => {
 if (status == 1) {
  sendLog('processing') jumpTo('IndexPage')
 } else if (status == 2) {
  sendLog('fail') jumpTo('FailPage')
 } else if (status == 3) {
  sendLog('fail') jumpTo('FailPage')
 } else if (status == 4) {
  sendLog('success') jumpTo('SuccessPage')
 } else if (status == 5) {
  sendLog('cancel') jumpTo('CancelPage')
 } else {
  sendLog('other') jumpTo('Index')
 }
}

转化成switch简化:

/**
 * 按钮点击事件
 * @param {number} status 活动状态:1 开团进行中 2 开团失败 3 商品售罄 4 开团成功 5 系统取消
 */
const onButtonClick = (status) => {
 switch (status) {
  case 1:
   sendLog('processing')
   jumpTo('IndexPage')
   break
  case 2:
  case 3:
   sendLog('fail')
   jumpTo('FailPage')
   break
  case 4:
   sendLog('success')
   jumpTo('SuccessPage')
   break
  case 5:
   sendLog('cancel')
   jumpTo('CancelPage')
   break
  default:
   sendLog('other')
   jumpTo('Index')
   break
 }
}

将判断条件作为对象的属性名,将处理逻辑作为对象的属性值,继续简化:

const actions = {
 '1': ['processing', 'IndexPage'],
 '2': ['fail', 'FailPage'],
 '3': ['fail', 'FailPage'],
 '4': ['success', 'SuccessPage'],
 '5': ['cancel', 'CancelPage'],
 'default': ['other', 'Index'],
}
/**
 * 按钮点击事件
 * @param {number} status 活动状态:1开团进行中 2开团失败 3 商品售罄 4 开团成功 5 系统取消
 */
const onButtonClick = (status) => {
 let action = actions[status] || actions['default'],
  logName = action[0],
  pageName = action[1]
 sendLog(logName)
 jumpTo(pageName)
}

转化成Map简化

const actions = new Map([
 [1, ['processing', 'IndexPage']],
 [2, ['fail', 'FailPage']],
 [3, ['fail', 'FailPage']],
 [4, ['success', 'SuccessPage']],
 [5, ['cancel', 'CancelPage']],
 ['default', ['other', 'Index']]
])
/**
 * 按钮点击事件
 * @param {number} status 活动状态:1 开团进行中 2 开团失败 3 商品售罄 4 开团成功 5 系统取消
 */
const onButtonClick = (status) => {
 let action = actions.get(status) || actions.get('default')
 sendLog(action[0])
 jumpTo(action[1])
}

Map对象和Object对象的区别:Map的键可以是任意值,Map的键值对个数可通过size属性直接获

接下来将问题升级:

除去判断状态还要判断用户身份:

传统写法:

const actions = new Map([
 ['guest_1', () => { /*do sth*/ }],
 ['guest_2', () => { /*do sth*/ }],
 ['guest_3', () => { /*do sth*/ }],
 ['guest_4', () => { /*do sth*/ }],
 ['guest_5', () => { /*do sth*/ }],
 ['master_1', () => { /*do sth*/ }],
 ['master_2', () => { /*do sth*/ }],
 ['master_3', () => { /*do sth*/ }],
 ['master_4', () => { /*do sth*/ }],
 ['master_5', () => { /*do sth*/ }],
 ['default', () => { /*do sth*/ }],
])
/**
 * 按钮点击事件
 * @param {string} identity 身份标识:guest客态 master主态
 * @param {number} status 活动状态:1 开团进行中 2 开团失败 3 开团成功 4 商品售罄 5 有库存未开团
 */
const onButtonClick = (identity, status) => {
 let action = actions.get(`${identity}_${status}`) || actions.get('default')
 action.call(this)
}

用对象做键值简化:

const actions = new Map([
 [{
  identity: 'guest',
  status: 1
 }, () => { /*do sth*/ }],
 [{
  identity: 'guest',
  status: 2
 }, () => { /*do sth*/ }],
 //...
])
const onButtonClick = (identity, status) => {
 //下面代码使用了数组解构 [key,value] = cuurrentValue
 let action = [...actions].filter(([key, value]) => (key.identity == identity && key.status == status))
 action.forEach(([key, value]) => value.call(this))
}

正则作为key

const actions = () => {
 const functionA = () => { /*do sth*/ }
 const functionB = () => { /*do sth*/ }
 return new Map([
  [/^guest_[1-4]$/, functionA],
  [/^guest_5$/, functionB],
  //...
 ])
}
const onButtonClick = (identity, status) => {
 let action = [...actions()].filter(([key, value]) => (key.test(`${identity}_${status}`)))
 action.forEach(([key, value]) => value.call(this))
}

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容可查看本站专题:《JavaScript操作DOM技巧总结》、《JavaScript页面元素操作技巧总结》、《JavaScript事件相关操作与技巧大全》、《JavaScript查找算法技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript错误与调试技巧总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
Javascript MD4
Dec 20 Javascript
Mootools 1.2教程 类(一)
Sep 15 Javascript
用JQuery模仿淘宝的图片放大镜显示效果
Sep 15 Javascript
开发插件的两个方法jquery.fn.extend与jquery.extend
Nov 21 Javascript
javascript获取隐藏元素(display:none)的高度和宽度的方法
Jun 06 Javascript
不到30行JS代码实现Excel表格的方法
Nov 15 Javascript
浅谈angularJS 作用域
Jul 05 Javascript
详解使用nvm安装node.js
Jul 18 Javascript
javascript实现文字无缝滚动效果
Aug 26 Javascript
vue mint-ui学习笔记之picker的使用
Oct 11 Javascript
使用webpack4编译并压缩ES6代码的方法示例
Apr 24 Javascript
ant-design表单处理和常用方法及自定义验证操作
Oct 27 Javascript
JS继承定义与使用方法简单示例
Feb 19 #Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
Feb 19 #Javascript
vue中实现回车键登录功能
Feb 19 #Javascript
Vue中实现回车键切换焦点的方法
Feb 19 #Javascript
整理 node-sass 安装失败的原因及解决办法(小结)
Feb 19 #Javascript
Vue常用的全选/反选的示例代码
Feb 19 #Javascript
详解node和ES6的模块导出与导入
Feb 19 #Javascript
You might like
php中定义网站根目录的常用方法
2010/08/08 PHP
深入PHP与浏览器缓存的分析
2013/06/03 PHP
解析Ubuntu下crontab命令的用法
2013/06/24 PHP
标准版Eclipse搭建PHP环境的详细步骤
2015/11/18 PHP
checkbox 多选框 联动实现代码
2008/10/22 Javascript
IE和Firefox下javascript的兼容写法小结
2008/12/10 Javascript
JavaScript实现快速排序(自已编写)
2012/12/19 Javascript
JQuery实现简单验证码提示解决方案
2012/12/20 Javascript
关于ExtJS4.1:快捷键支持的问题
2013/04/24 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
JQuery中使用ajax传输超大数据的解决方法
2014/07/14 Javascript
JavaScript判断一个字符串是否包含指定子字符串的方法
2015/03/18 Javascript
详解vue 模版组件的三种用法
2017/07/21 Javascript
浅谈Angular2 ng-content 指令在组件中嵌入内容
2017/08/18 Javascript
Vue 实现双向绑定的四种方法
2018/03/16 Javascript
了解javascript中的Dom操作
2019/05/27 Javascript
vue项目中使用particles实现粒子背景效果及遇到的坑(按钮没有点击响应)
2020/02/11 Javascript
JavaScript组合设计模式--改进引入案例分析
2020/05/23 Javascript
夯基础之手撕javascript继承详解
2020/11/09 Javascript
Python实现统计给定列表中指定数字出现次数的方法
2018/04/11 Python
python字典嵌套字典的情况下找到某个key的value详解
2019/07/10 Python
高级销售员求职信
2013/10/25 职场文书
法律工作求职自荐信
2013/10/31 职场文书
《走一步再走一步》教学反思
2014/02/15 职场文书
餐厅采购员岗位职责
2014/03/06 职场文书
土木工程求职信
2014/05/29 职场文书
社区矫正工作方案
2014/06/04 职场文书
卖车协议书范例
2014/09/16 职场文书
免职证明样本
2014/10/23 职场文书
先进党员事迹材料
2014/12/24 职场文书
律师催款函范文
2015/06/24 职场文书
2015年城管执法工作总结
2015/07/23 职场文书
深入解析NumPy中的Broadcasting广播机制
2021/05/30 Python
图解排序算法之希尔排序Java实现
2021/06/26 Java/Android
关于MySQL临时表为什么可以重名的问题
2022/03/22 MySQL
Redis基本数据类型Set常用操作命令
2022/06/01 Redis