- con即
condition
条件,atcon,指为条件而生; - at也来源atom,代表它是一个原子操作;
- 把复杂的
if else
逻辑转变为简单的原子操作,就在atcon。
和复杂的 if else
说再见
npm install --save atcon
const atcon = require('atcon');
atcon(conditions, states, predicate);
- 根据
states
数组项元素,依次查找condtions
对象(也可以是数组)的state0
属性,得到conditons1
对象,再查找conditons1
的state1
属性...... 其实相当于一个reduce
predicate
接收reduce
传进来的每一项的conditon[state]
,如果满足条件,predicate
函数return true
就退出查找,得到该值- 如果
conditon[state]
不存在,则重新回到上层查找,层层回溯,并获取该层对象的__DEFAULT__
属性,传递给predicate
,同样的,如果return true
,退出查找,得到该值。其实相当于switch
内的default
const imgMap = {
online: {
'2': {
a: 'img_b',
b: 'img_o'
},
'3': {
a: 'img_b',
b: 'img_p'
},
'4': 'img_c',
'5': 'img_d',
'6': 'img_e'
},
offline: {
'2': 'img_h',
'3': 'img_i',
'4': 'img_j',
'5': 'img_k',
'6': 'img_l'
},
__DEFAULT__: 'img_a'
};
const noticeMap = {
b: {
'3': 'text3',
'5': 'text5'
},
a: 'textaaa',
__DEFAULT__: 'textdefault'
};
const isString = obj => Object.prototype.toString.call(obj) === '[object String]';
atcon(imgMap, ['online', 3, 'a'], isString); // 'img_b'
atcon(imgMap, ['online', 3, 'c'], isString); // 'img_a'
atcon(imgMap, ['offline', 3, 'v'], isString); // 'img_i'
atcon(imgMap, ['noline'], isString); // 'img_a'
atcon(noticeMap, ['b', 1], isString); // 'textdefault'
atcon(noticeMap, ['a', 6, 1, 5, 6], isString); // 'textaaa'
注意
atcon(noticeMap, ['b'], isString); // undefined
返回的是 undefined
,因为走进了 switch case b
的逻辑,但是switch case b
是一个对象,没有满足isString的条件,而这里没有指定下一层状态的话,循环就会在这一层戛然而止,而不再做回溯。
更多例子可直接参考mocha test
希望大家用得开心。
MIT