JS - 检查对象自己的所有属性是否为真



>我有一个对象,它有几个字段可能会被用户转换为 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",我怎么只能将成就文档字段"all"更新为 true,如下所示:{one: true, two: true, three: true}

带有真值检查的数组every()是在引用对象的键时进行测试的好方法。

var obj = {
 a: true,
 b: true
}
var isAllTrue = Object.keys(obj).every( function (key) {
    return obj[key]===true;
});
console.log(isAllTrue);

您似乎已经拥有基本逻辑,只是您正在比较key而不是使用该键obj[key]引用的value

由于属性测试都是同步的,因此可以将其放入一个简单的函数中,如下所示:

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
}
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);

较新的浏览器中可用的最短方法是:

var obj = { a: true, b: true }
var allTrue = Object.values(obj).every(val => val);

key只给你属性名称。如果要获取值,请使用 archis[key]

最新更新