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));
	}

  

posted on 2018-11-13 19:27  huyanluanyu1989  阅读(381)  评论(0编辑  收藏  举报