繁体   English   中英

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

[英]JS - Check if all an object's own properties are true

我有一个对象,其中包含多个字段,对于用户而言可能会变为true(想像成就列表)。 如果我有一个像{one: true, two: false, three: true} ,我将如何转义函数的执行(因为并非所有键都为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”,我将如何仅将实现doc字段“ 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
}

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

var obj = { a: true, b: true }

var allTrue = Object.values(obj).every(val => val);

key只为您提供属性名称。 如果要获取值,请使用archis[key]

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM