【问题标题】:JS - Check if all an object's own properties are trueJS - 检查对象的所有属性是否为真
【发布时间】:2016-06-07 02:55:25
【问题描述】:

我有一个对象,其中包含多个字段,这些字段可能会被用户转换为 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}

【问题讨论】:

    标签: javascript node.js object


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

    您似乎已经掌握了基本逻辑,只是您正在比较 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
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2016-06-05
            • 2015-06-04
            • 2014-05-06
            • 1970-01-01
            • 1970-01-01
            • 2019-09-30
            • 2014-08-22
            • 1970-01-01
            • 2017-12-11
            相关资源
            最近更新 更多