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 相关文章推荐
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
Dec 20 Javascript
javascript设计模式 接口介绍
Jul 24 Javascript
Javascript call和apply区别及使用方法
Nov 14 Javascript
基于jquery扩展漂亮的下拉框可以二次修改
Nov 19 Javascript
在JavaScript中正确引用bind方法的应用
May 11 Javascript
jQuery实现列表内容的动态载入特效
Aug 08 Javascript
js使用cookie记录用户名的方法
Nov 26 Javascript
Vue.js每天必学之过滤器与自定义过滤器
Sep 07 Javascript
仿iframe效果Aajx文件上传实例
Nov 18 Javascript
jQuery Validate 数组 全部验证问题
Jan 12 Javascript
JS实现简单短信验证码界面
Aug 07 Javascript
Vue 样式切换及三元判断样式关联操作
Aug 09 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
CodeIgniter辅助之第三方类库third_party用法分析
2016/01/20 PHP
php中Redis的应用--消息传递
2017/03/28 PHP
php实现在线考试系统【附源码】
2018/09/18 PHP
5个javascript的数字格式化函数分享
2011/12/07 Javascript
jQuery 回车事件enter使用示例
2014/02/18 Javascript
jquery获得同源iframe内body下标签的值的方法
2014/09/25 Javascript
JavaScript中原型和原型链详解
2015/02/11 Javascript
jquery中用jsonp实现搜索框功能
2016/10/18 Javascript
jQuery源码分析之init的详细介绍
2017/02/13 Javascript
jQuery 表单序列化实例代码
2017/06/11 jQuery
QRCode.js:基于JQuery的生成二维码JS库的使用
2017/06/23 jQuery
jquery引入外部CDN 加载失败则引入本地jq库
2018/05/23 jQuery
react组件从搭建脚手架到在npm发布的步骤实现
2019/01/09 Javascript
详解一个基于react+webpack的多页面应用配置
2019/01/21 Javascript
Vue 组件修改根实例的数据的方法
2019/04/02 Javascript
js实现点击生成随机div
2020/01/16 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
vue.js实现点击图标放大离开时缩小的代码
2021/01/27 Vue.js
[52:32]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第三场 11.18
2020/11/18 DOTA
测试、预发布后用python检测网页是否有日常链接
2014/06/03 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
2018/10/29 Python
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
2018/12/05 Python
Python+PyQt5实现美剧爬虫可视工具的方法
2019/04/25 Python
python-django中的APPEND_SLASH实现方法
2019/06/21 Python
简单了解python装饰器原理及使用方法
2019/12/18 Python
利用CSS3把图片变成灰色模式的实例代码
2016/09/06 HTML / CSS
Java Servlet API中forward() 与redirect()的区别
2014/04/20 面试题
热能动力工程毕业生自荐信
2013/11/07 职场文书
学校后勤人员职责
2013/12/27 职场文书
统计系教授推荐信
2014/02/28 职场文书
星级党支部申报材料
2014/05/31 职场文书
高考励志标语
2014/06/05 职场文书
敬老院献爱心活动总结
2014/07/08 职场文书
幼儿园中班教师个人总结
2015/02/05 职场文书
高二英语教学反思
2016/03/03 职场文书
mysql数据库隔离级别详解
2022/06/16 MySQL