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 ...
随机推荐
- HDU - 3631 Shortest Path(Floyd最短路)
Shortest Path Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u SubmitStat ...
- Can JavaScript connect with MySQL? 浏览器控制台的js采集数据结果持久化存储
浏览器控制台的js采集数据结果持久化存储 how to open a file in javascript https://developer.mozilla.org/en-US/docs/Web/A ...
- js对象和json的区别
他们两个没有什么关联只不过可以相互转换而已,就像json可以转化为java对象一样 注意:json只有字符串形式(就是我们常说的json字符串:key/value值和数组形式的字符串),没有什么jso ...
- Vue相关开源项目库汇总 http://www.opendigg.com/tags/front-vue
awesome-github-vue 是由OpenDigg整理并维护的Vue相关开源项目库集合.我们会定期同步OpenDigg上的项目到这里,也欢迎各位提交项目给我们. 如果收录的项目有错误,可以通过 ...
- B1072 [SCOI2007]排列perm 状压dp
很简单的状压dp,但是有一个事,就是...我数组开大了一点,然后每次memset就会T,然后开小就好了!!!震惊!以后小心点这个问题. 题干: Description 给一个数字串s和正整数d, 统计 ...
- 第二周 Leetcode 493. Reverse Pairs(HARD)
leetcode 493跟经典的逆序对问题没有什么区别, 首先考虑对数组前半部和后半部求逆序对数,若能保证两段数组都有序,则显然可以在线性时间内求出对数. 所以我们采用归并排序的方法,一方面让数组有序 ...
- residual sum of squares(ESL 读书笔记)
The learning algorithm has the property that it can modify its input/output relationship f-hat in re ...
- openstack instance resize to rebuild
- 我眼中的SEO——略读一些SEO书后
近些日子一直在看一些SEO方面的书.为人有些浮躁,读SEO实在读不出太大营养,除了第一本书外,之后的书就是在不停地向后翻页.没有过太具体的实践,现在就来写一下我眼中的SEO.还希望各位多多指教. 1. ...
- [Swift通天遁地]八、媒体与动画-(5)使用开源类库绘制文字、图形、图像、图表、SVG(可缩放矢量图形)
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...