我有一个对象有几个字段,可能会被用户转移到true(想象成就列表)。如果我有一个像{one: true, two: false, three: true}
这样的对象,我怎么能逃脱函数的执行(因为不是所有的键都是真的)?这是我到目前为止所尝试的:
for (var key in achis) {
if (achis.hasOwnProperty(key)) {
if (key === false) {
cb && cb();
return;
}
}
}
achievements.update({userId: achis.userid}, {$set: {all: true}}, function(err) {
if (err) {
console.log(err);
}
cb && cb();
return;
});
如果achis中的所有键值都是“true”,我将如何才能仅将“acheivements”字段“all”更新为true:{one: true, two: true, three: true}
答案 0 :(得分:2)
带有真值检查的数组every()
是在引用对象的键时进行测试的好方法。
var obj = {
a: true,
b: true
}
var isAllTrue = Object.keys(obj).every( function (key) {
return obj[key]===true;
});
console.log(isAllTrue);
答案 1 :(得分:1)
您似乎已经拥有了基本逻辑,除非您使用该密钥key
比较value
而不是您引用的obj[key]
。
由于属性测试都是同步的,你可以把它放到一个简单的函数中:
function testAllProperties(obj, val) {
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
if (obj[key] !== val) {
return false;
}
}
}
return true;
}
if (testAllProperties(achis, true)) {
// all properties are true
} else {
// some properties are not true
}
答案 2 :(得分:1)
新浏览器中可用的最短方法是:
var obj = { a: true, b: true }
var allTrue = Object.values(obj).every(val => val);
答案 3 :(得分:0)
key
只会为您提供属性名称。如果您想使用archis[key]
来获取值。
答案 4 :(得分:0)
Array.prototype.every()
非常适合您的解决方案。
var o1 = {one: true, two: false, three: true},
o2 = {one: true, two: true, three: true},
CB = _ => console.log("I am doing something because the object is all true"),
runCB = o => Object.keys(o).every(k => o[k]) && CB();
runCB(o1);
runCB(o2);