JavaScript 复杂判断的优雅写法
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 复杂判断的优雅写法的更多相关文章
- JavaScript复杂判断的更优雅写法
摘要: 写代码是一门艺术. 原文:JavaScript 复杂判断的更优雅写法 作者:Think. 公众号:大转转fe Fundebug经授权转载,版权归原作者所有. 前提 我们编写js代码时经常遇到复 ...
- JavaScript中判断变量类型最简洁的实现方法以及自动类型转换(#################################)
这篇文章主要介绍了JavaScript中判断整字类型最简洁的实现方法,本文给出多个判断整数的方法,最后总结出一个最短.最简洁的实现方法,需要的朋友可以参考下 我们知道JavaScript提供了type ...
- 输入5至10之间的数字(用javaScript实现判断)
输入5至10之间的数字 ----用javaScript实现判断 代码如下: <!DOCTYPE html><html><body> <script>fu ...
- Javascript中判断数组的正确姿势
在 Javascript 中,如何判断一个变量是否是数组? 最好的方式是用 ES5 提供的 Array.isArray() 方法(毕竟原生的才是最屌的): var a = [0, 1, 2]; con ...
- JavaScript中判断为整数的多种方式
之前记录过JavaScript中判断为数字类型的多种方式,这篇看看如何判断为整数类型(Integer). JavaScript中不区分整数和浮点数,所有数字内部都采用64位浮点格式表示,和Java的d ...
- 关于 JavaScript 数据类型判断
在 JavaScript 中,有 undefined.null.number.string.boolean 五种基本数据类型,另外,有一种复杂数据类型 object ,类似于 C# 中值类型.引用类型 ...
- Android点滴---ViewHolder通用,优雅写法
近期在做项目时,又要写 ViewHolder. 突然想到网上看看有没什么好的写法! 不知道你是不是也烦透了写那些没有技术含量的ViewHolder 看看这些.也许会有收获! 然后就找到了以下两篇文章( ...
- Java与JavaScript中判断两字符串是否相等的区别
JavaScript是一种常用的脚本语言,这也决定了其相对于其他编程语言显得并不是很规范.在JavaScript中判断两字符串是否相等 直接用==,这与C++里的String类一样.而Java里的等号 ...
- JavaScript中判断整字类型最简洁的实现方法
这篇文章主要介绍了JavaScript中判断整字类型最简洁的实现方法,本文给出多个判断整数的方法,最后总结出一个最短.最简洁的实现方法,需要的朋友可以参考下 我们知道JavaScript提供了type ...
随机推荐
- 【原创】分布式之缓存击穿 【原创】自己动手实现静态资源服务器 【原创】自己动手实现JDK动态代理
[原创]分布式之缓存击穿 什么是缓存击穿 在谈论缓存击穿之前,我们先来回忆下从缓存中加载数据的逻辑,如下图所示 因此,如果黑客每次故意查询一个在缓存内必然不存在的数据,导致每次请求都要去存储层去查 ...
- Android开发之利用SQLite进行数据存储
Android开发之利用SQLite进行数据存储 Android开发之利用SQLite进行数据存储 SQLite数据库简单介绍 Android中怎样使用SQLite 1 创建SQLiteOpenHel ...
- 性能测试实战-XYB项目-外网访问
压测业务选择 跟产品.开发负责人评估系统中需要压测的重要业务接口 考虑到考勤业务是每天老师都需要做的且可多次考勤,列入压测重要业务中 值日检查也是每天老师都需要操作的业务,最终选择了考勤业务及值日检查 ...
- keepalived+nginx安装配置
软件版本号: pcre8.36 ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.36.tar.gz keepalived1.2 ...
- HDFS02
读取流程 写流程 ============SecondaryNameNode============ Namenode的一个快照 周期性的备份namenode 记录namenode中的metadata ...
- 速度上手LM4F LaunchPad 输出多路PWM波
最近转战到TI的Cortex M4平台后,发现网上关于TI的LM4F120 Launchpad 资料太少了,而且其中大部分都是TI员工或者其合作伙伴提供的,例程太少,导致新手上手很慢. 我只是要实现几 ...
- linux 设备树及节点引用【转】
本文转载自:http://blog.csdn.net/KjfureOne/article/details/51972854 1.ARM Linux社区为什么要引入设备树 Linux之父Linus To ...
- zabbix监控kafka消费
一.Kafka监控的几个指标 1.lag:多少消息没有消费 lag=logsize-offset 2.logsize:Kafka存的消息总数 3.offset:已经消费的消息 Kafka管理工具 介绍 ...
- P4407 [JSOI2009]电子字典
传送门 我的哈希打挂了--然而大佬似乎用哈希可以过还跑得很快-- 删除,枚举删哪个字符,记删之后的哈希值存map 插入,相当于在单词里删字符,去对应的map里查找 更改,相当于两个都删掉同一个位置的字 ...
- 一款超好用的第三方评论插件--Gitalk
一,使用Gitalk的背景: 1.最近在做一个基于Java的个人博客系统,已经基本完工了,突然发现怎么没有评论的操作,如果再从头开始从数据库开始写的话,花费的代价有点大,于是乎我就在网上寻找一款适合我 ...