与 chmod 类似,我想使用 1、2、4 作为通知方式。
1 = Email
2 = SMS
4 = Push notifications
是否有函数(最好是在 javascript 中)可以输入一个数字(上图)并可以返回一个对象:
{
email: true,
sms: true,
push: false
}
我希望函数不被硬编码。我不想要一堆 if 语句来检查每个组合。我想要一种“聪明”的方式来做到这一点。
与 chmod 类似,我想使用 1、2、4 作为通知方式。
1 = Email
2 = SMS
4 = Push notifications
是否有函数(最好是在 javascript 中)可以输入一个数字(上图)并可以返回一个对象:
{
email: true,
sms: true,
push: false
}
我希望函数不被硬编码。我不想要一堆 if 语句来检查每个组合。我想要一种“聪明”的方式来做到这一点。
像这样的东西怎么样:
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])
}
尝试这样的事情 - 抱歉,这是 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}
将多个参数发送到函数的解决方案:
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}