多元判断的Object和Map表示

/**
 * 按钮点击事件
 * @param {number} status 活动状态:1进行中 2失败 3 成功 4 售罄 5 未开团
 * @param {string} identity 身份标识:guest客态 master主态
 */
第一种 Object形式
const actions = {
  'guest_1':()=>{/*do sth*/},
  'guest_2':()=>{/*do sth*/},
  'master_1':()=>{/*do sth*/},
  'master_2':()=>{/*do sth*/},
  //....
}

const onButtonClick = (identity,status)=>{
  let action = actions[`${identity}_${status}`] || actions['default']
  action.call(this)
}
第二种 Map形式
const actions = new Map([
  [{identity:'guest',status:1},()=>{/*do sth*/}],
  [{identity:'guest',status:2},()=>{/*do sth*/}],
  [{identity:'master',status:1},()=>{/*do sth*/}],
  [{identity:'master',status:2},()=>{/*do sth*/}],
  //...
])
const onButtonClick = (identity,status)=>{
  let action = [...actions].find(([key,value])=>(key.identity == identity && key.status == status))
  action[1].call(this);
}
// 如果增加判断,status1-4的处理逻辑一样,并且所有guest都上报埋点
const actions = ()=>{
  const functionA = ()=>{/*do sth*/}
  const functionB = ()=>{/*do sth*/}
  const functionC = ()=>{/*do sth*/}
  const functionD = ()=>{/*do sth*/}
  const functionE = ()=>{/*send log*/}
  // map的优势在于key可以任何类型
  return new Map([
    [/^guest_[1-4]$/,functionA],
    [/^guest_5$/,functionB],
    [/^guest_.*$/,functionE],
    [/^master[1-4]$/,functionC],
    [/^master_5$/,functionD],
    //...
  ])
}

const onButtonClick = (identity,status)=>{
  let action = [...actions()].filter(([key,value])=>(key.test(`${identity}_${status}`)))
  action.forEach(([key,value])=>value.call(this))
}

你可能感兴趣的:(多元判断的Object和Map表示)