JavaScript 复杂判断的优雅写法

<div>
<input type="button" name="btn" value="点我呀" id='btn'>
<input type="button" name="upgBtn" value='升级版' id='upgBtn'>
<input type="button" name="superBtn" value='超级版' id='superBtn'>
</div>

  

<script type="text/javascript">
/**
* 8种逻辑判断方法
* 1.if/else
* 2.switch
* 3.一元判断时:存到Object里
* 4.一元判断时:存到Map里
* 5.多元判断时:将condition拼接成字符串存到Object里
* 6.多元判断时:将condition拼接成字符串存到Map里
* 7.多元判断时:将condition存为Object存到Map里
* 8.多元判断时:将condition写作正则存到Map里
*/
var btn = document.getElementById("btn");
btn.onclick = function(){
btnClick(7)
} var upgBtn = document.getElementById('upgBtn');
upgBtn.onclick = function(){
upgBtnClick(1,'guest');
} var superBtn = document.getElementById('superBtn');
superBtn.onclick = function(){
superBthClick('guest',2);
} /**
* 按扭点击事件
* @param{number} status 购买种类:1水果类 2食品类 3服妆类 4彩妆类
*/ const btnClick = (status)=>{
if(status == 1){
sendLog('您正在访问水果类....');
jumpTo('fruitIndex');
}else if(status == 2){
sendLog('您正在访问食品类....');
jumpTo('foodIndex');
}else if(status == 3){
sendLog('您正在访问服装类....');
jumpTo('clothingIndex');
}else if(status == 4){
sendLog('您正在访问彩妆类....');
jumpTo('makeupIndex');
}else{
sendLog('您访问的页面不存在....');
jumpTo('Pages do not exist');
}
} const btnClick = (status)=>{
switch(status){
case 1:
sendLog('您正在访问水果类....');
jumpTo('fruitIndex');
break;
case 2:
sendLog('您正在访问食品类....');
jumpTo('foodIndex');
break;
case 3:
sendLog('您正在访问服装类....');
jumpTo('clothingIndex');
break;
case 4:
sendLog('您正在访问彩妆类....');
jumpTo('makeupIndex');
break;
default:
sendLog('您访问的页面不存在....');
jumpTo('Pages do not exist');
break;
}
} //通过对象属性查找的方式来进行逻辑判断,这种写法特别适合一元条件判断的情况
const actions = {
'1':['您正在访问水果类....','fruitIndex'],
'2':['您正在访问食品类....','foodIndex'],
'3':['您正在访问服装类....','clothingIndex'],
'4':['您正在访问彩妆类....','makeupIndex'],
'default':['您访问的页面不存在....','Pages do not exist'],
}
const btnClick = function(status){
let action = actions[status] || actions['default'],
logName = action[0],
page = action[1];
sendLog(logName);
jumpTo(page);
} /**
* 通过es6里的Map对象
* @type {Map}
* 1、一个对象通常都有自己的原型,所以一个对象总有一个'prototype'键。
* 2、一个对象的键只能是字符串或者Symbols,但是一个Map的键可以是任意值。
* 3、你可以通过size属性很容易地得到Map的键值对个数,而对象的键值对个数只能手动确认。
*/
const actions = new Map([
[1,['您正在访问水果类....','fruitIndex']],
[2,['您正在访问食品类....','foodIndex']],
[3,['您正在访问服装类....','clothingIndex']],
[4,['您正在访问彩妆类....','makeupIndex']],
['default',['您访问的页面不存在....','failPage']]
]) const btnClick = (status)=>{
let action = actions.get(status) || actions.get('default');
sendLog(action[0]);
jumpTo(action[1]);
}
function sendLog(content){
console.log(content);
}
function jumpTo(page){
console.log(page);
} /**
* 当当当当,升级版的判断来了
*/
const upgActions = new Map([
['guest_1',()=>{console.log('guest_1')}],
['guest_2',()=>{console.log('guest_2')}],
['admin_1',()=>{console.log('admin_1')}],
['default',()=>{console.log('default')}]
])
const upgBtnClick = (status,indentity)=>{
let action = upgActions.get(`${indentity}_${status}`) || upgActions.get('default');
action.call(this);
} 用Object实现
const upgActions = {
'guest_1':()=>{console.log('guest_1')},
'guest_2':()=>{console.log('guest_2')},
'admin_1':()=>{console.log('admin_1')},
'default':()=>{console.log('default')}
} const upgBtnClick = (status, indentity) => {
let action = upgActions[`${indentity}_${status}`] || upgActions['default'];
action.call(this);
} const upgActions = new Map([
[{indentity:'guest',status:1},()=>{console.log('guest_1')}],
[{indentity:'guest',status:2},()=>{console.log('guest_2')}]
]) const upgBtnClick = (status, indentity)=>{
let action = [...upgActions].filter(([key,value])=>(key.indentity == indentity && key.status == status))
action.forEach(([key,value])=>value.call(this))
} //凡是guest都要发送一个日志埋点,不同的status情况也需要单独逻辑处理
const superActions=()=>{
const functionA = ()=>console.log("functionA");
const functionB = ()=>console.log("functionB");
const functionC = ()=>console.log("functionC");
return new Map([
[/^guest_[1-4]$/,functionA],
[/^guest_5$/,functionB],
[/^guest_.*$/,functionC]
])
} const superBthClick = (indentity,status)=>{
console.log(status)
let action = [...superActions()].filter(([key,value])=>(key.test(`${indentity}_${status}`)));
action.forEach(([key, value])=>value.call(this));
}

  

JavaScript 复杂判断的优雅写法的更多相关文章

  1. JavaScript复杂判断的更优雅写法

    摘要: 写代码是一门艺术. 原文:JavaScript 复杂判断的更优雅写法 作者:Think. 公众号:大转转fe Fundebug经授权转载,版权归原作者所有. 前提 我们编写js代码时经常遇到复 ...

  2. JavaScript中判断变量类型最简洁的实现方法以及自动类型转换(#################################)

    这篇文章主要介绍了JavaScript中判断整字类型最简洁的实现方法,本文给出多个判断整数的方法,最后总结出一个最短.最简洁的实现方法,需要的朋友可以参考下 我们知道JavaScript提供了type ...

  3. 输入5至10之间的数字(用javaScript实现判断)

    输入5至10之间的数字 ----用javaScript实现判断 代码如下: <!DOCTYPE html><html><body> <script>fu ...

  4. Javascript中判断数组的正确姿势

    在 Javascript 中,如何判断一个变量是否是数组? 最好的方式是用 ES5 提供的 Array.isArray() 方法(毕竟原生的才是最屌的): var a = [0, 1, 2]; con ...

  5. JavaScript中判断为整数的多种方式

    之前记录过JavaScript中判断为数字类型的多种方式,这篇看看如何判断为整数类型(Integer). JavaScript中不区分整数和浮点数,所有数字内部都采用64位浮点格式表示,和Java的d ...

  6. 关于 JavaScript 数据类型判断

    在 JavaScript 中,有 undefined.null.number.string.boolean 五种基本数据类型,另外,有一种复杂数据类型 object ,类似于 C# 中值类型.引用类型 ...

  7. Android点滴---ViewHolder通用,优雅写法

    近期在做项目时,又要写 ViewHolder. 突然想到网上看看有没什么好的写法! 不知道你是不是也烦透了写那些没有技术含量的ViewHolder 看看这些.也许会有收获! 然后就找到了以下两篇文章( ...

  8. Java与JavaScript中判断两字符串是否相等的区别

    JavaScript是一种常用的脚本语言,这也决定了其相对于其他编程语言显得并不是很规范.在JavaScript中判断两字符串是否相等 直接用==,这与C++里的String类一样.而Java里的等号 ...

  9. JavaScript中判断整字类型最简洁的实现方法

    这篇文章主要介绍了JavaScript中判断整字类型最简洁的实现方法,本文给出多个判断整数的方法,最后总结出一个最短.最简洁的实现方法,需要的朋友可以参考下 我们知道JavaScript提供了type ...

随机推荐

  1. HDU - 3631 Shortest Path(Floyd最短路)

    Shortest Path Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u SubmitStat ...

  2. Can JavaScript connect with MySQL? 浏览器控制台的js采集数据结果持久化存储

    浏览器控制台的js采集数据结果持久化存储 how to open a file in javascript https://developer.mozilla.org/en-US/docs/Web/A ...

  3. js对象和json的区别

    他们两个没有什么关联只不过可以相互转换而已,就像json可以转化为java对象一样 注意:json只有字符串形式(就是我们常说的json字符串:key/value值和数组形式的字符串),没有什么jso ...

  4. Vue相关开源项目库汇总 http://www.opendigg.com/tags/front-vue

    awesome-github-vue 是由OpenDigg整理并维护的Vue相关开源项目库集合.我们会定期同步OpenDigg上的项目到这里,也欢迎各位提交项目给我们. 如果收录的项目有错误,可以通过 ...

  5. B1072 [SCOI2007]排列perm 状压dp

    很简单的状压dp,但是有一个事,就是...我数组开大了一点,然后每次memset就会T,然后开小就好了!!!震惊!以后小心点这个问题. 题干: Description 给一个数字串s和正整数d, 统计 ...

  6. 第二周 Leetcode 493. Reverse Pairs(HARD)

    leetcode 493跟经典的逆序对问题没有什么区别, 首先考虑对数组前半部和后半部求逆序对数,若能保证两段数组都有序,则显然可以在线性时间内求出对数. 所以我们采用归并排序的方法,一方面让数组有序 ...

  7. residual sum of squares(ESL 读书笔记)

    The learning algorithm has the property that it can modify its input/output relationship f-hat in re ...

  8. openstack instance resize to rebuild

  9. 我眼中的SEO——略读一些SEO书后

    近些日子一直在看一些SEO方面的书.为人有些浮躁,读SEO实在读不出太大营养,除了第一本书外,之后的书就是在不停地向后翻页.没有过太具体的实践,现在就来写一下我眼中的SEO.还希望各位多多指教. 1. ...

  10. [Swift通天遁地]八、媒体与动画-(5)使用开源类库绘制文字、图形、图像、图表、SVG(可缩放矢量图形)

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...