zoukankan      html  css  js  c++  java
  • 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));
    	}
    

      

  • 相关阅读:
    Android 六种核心安全机制
    Android 网络通信 HTTP
    Android Thread和AsyncTask
    C#(少用的)
    Asp.net动态生成表单
    设计模式--职责链(学习)
    Extjs表单验证小结
    C#框架
    Javascript获取IFrame内容(兼容IE&FF)
    最近在忙淘宝店的事
  • 原文地址:https://www.cnblogs.com/huyanluanyu/p/9954174.html
Copyright © 2011-2022 走看看