2

与 chmod 类似,我想使用 1、2、4 作为通知方式。

1 = Email 
2 = SMS 
4 = Push notifications

是否有函数(最好是在 javascript 中)可以输入一个数字(上图)并可以返回一个对象:

{
    email: true,
    sms: true,
    push: false
}

我希望函数不被硬编码。我不想要一堆 if 语句来检查每个组合。我想要一种“聪明”的方式来做到这一点。

4

3 回答 3

5

像这样的东西怎么样:

var commsMode = {
    email: 1,
    sms: 2,
    push: 4,
    toObject: function(val){
        var rt = {};

        for (e in commsMode) {
            rt[e] = (val & commsMode[e]) > 0;
        }

        return rt;
    }
};

var obj = commsMode.toObject(3);

这里的工作示例

扩展示例:

var commsMode = {
    email: 1,
    sms: 2,
    push: 4,
    mode4: 8,
    mode5: 16,
    mode6: 32,
    mode7: 64,
    mode8: 128,
    toObject: function(val){
        var rt = {};

        for (e in commsMode) {
            rt[e] = (val & commsMode[e]) > 0;
        }

        return rt;
    }
};

var obj = commsMode.toObject(233);

for (p in obj) {
    alert(p + ': ' + obj[p])
}

这里的工作示例

于 2013-03-21T22:51:15.467 回答
2

尝试这样的事情 - 抱歉,这是 Python,但 JavaScript 翻译应该非常相似:

def notifications(mask):
    return {
        'email' : mask & 4 != 0,
        'sms'   : mask & 2 != 0,
        'push'  : mask & 1 != 0
    }

notifications(0b111) # same as notifications(7), or notifications(email+sms+push)
=> {'push': True, 'sms': True, 'email': True}

在上面,我们说通知二进制位掩码是0b111(或 7,如果您更喜欢使用 base-10),这意味着所有三个通知都已启用。同样,如果我们作为位掩码0b010(或 base-10 中的 2)传递,那么答案将是:

notifications(0b010) # same as notifications(2), or notifications(sms)
=> {'push': False, 'sms': True, 'email': False}
于 2013-03-21T22:54:52.057 回答
0

将多个参数发送到函数的解决方案:

var states = {
  '1': 'email',
  '2': 'sms',
  '4': 'push'
};

function getStates(){
 var o = {};
 for(var val in states){
   o[states[val]] = false;   
 }

   for(var i=0;i<arguments.length;i++){
     var arg = arguments[i];  
     var state = states[arg];
      if(state){
        o[state] = true;
      }  
  }

  return o;
}

console.log(getStates()); // return {email: false, sms: false, push: false}
console.log(getStates(1,2)); // return {email: true, sms: true, push: false} 

http://jsfiddle.net/ZTA6E/

于 2013-03-21T22:55:51.157 回答