JS - 检查对象的所有属性是否都为true

时间:2016-06-07 02:55:26

标签: javascript node.js object

我有一个对象有几个字段,可能会被用户转移到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}

5 个答案:

答案 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);