如何知道所有的javascript对象值是否为真?

76

在JavaScript中,我需要知道所有对象项是否设置为true。

如果我有以下对象:

var myObj = {title:true, name:true, email:false};

我可以像这样写一些内容:

 if(myObj.title && myObj.name && myObj.email){
 /*Some code */
};

但我正在寻找最简单的编写方式。例如:

if(myObj all is true){
/*Some code */
};

我可能有另一个包含10-20个项目的对象,并且需要知道它们是否都为真。

5个回答

99

使用 ES2017 的 Object.values() 方法,生活会更加简单。

Object.values(yourTestObject).every(item => item)

使用Boolean()函数进行简短的操作 [感谢xab]

Object.values(yourTestObject).every(Boolean)

或者使用更严格的true检查。

Object.values(yourTestObject)
    .every(item => item === true)

13
为了进一步简化真值检查:Object.values(yourTestObject).every(Boolean) - xab
4
最好在那个使用布尔值的地方添加一个文档链接。本质上,它是将Boolean()对象包装器作为函数传递到every()函数中。请参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean。 - rooby
在我看来,那是更好的答案。我会检查一下,但如果你碰巧能在那里回答:它是否也适用于嵌套值? - Billybobbonnet
2
@Billybobbonnet 你只需要修改传递给 every 方法内部的函数表达式即可。例如:Object.values(target).every(item => item.deeply.nested.property === SOME_VALUE) - Nachiketha

63

在现代浏览器中:

var allTrue = Object.keys(myObj).every(function(k){ return myObj[k] });

如果你真的想要检查是否为 true,而不仅仅是一个 truthy 值:

var allTrue = Object.keys(myObj).every(function(k){ return myObj[k] === true });

Object.keys(myObj).every(function(k){ return this[k] }, myObj);使用该代码可以遍历对象中的所有键,并检查它们是否都存在于对象中。 - dandavis
12
myObj.every无法工作,因为.every仅适用于数组。 - Badrush

39

比如说这样怎么样:

    function allTrue(obj)
    {
      for(var o in obj)
          if(!obj[o]) return false;
        
      return true;
    }
    
    var myObj1 = {title:true, name:true, email:false};
    var myObj2 = {title:true, name:true, email:true};

    document.write('<br />myObj1 all true: ' + allTrue(myObj1));
    document.write('<br />myObj2 all true: ' + allTrue(myObj2));

    

声明:如果所有值都是“真”,则此代码将返回true,并非完全等于布尔值True。此外,它将扫描传递对象的所有属性,包括其原型。这可能是您需要的,但也可能不是,但对于您提供的简单对象字面量,它应该可以正常工作。


2
你还需要包含hasOwnProperty的检查,否则对象原型可能会干扰。 - Yuriy Galanter
1
是的,我考虑过包含那个,但觉得会让例子变得太复杂。所以我在免责声明中指出了这一点。 - Mike Christensen
不错,但如果其中一个属性值是空数组[],而另一个属性值为null呢? - Experimenter

2

最快的方法是循环

for(var index in myObj){
  if(!myObj[index]){ //check if it is truly false
    var fail = true
  }
}
if(fail){
  //test failed
}

这段代码将循环数组中的所有值,然后检查该值是否为false,如果是,则设置fail变量,告诉您测试失败。

3
一旦找到一个失败的值,可能就没有继续循环的必要了。 - Mike Christensen
是的...你可以使用 break 退出循环,或者如果这段代码是函数的一部分(应该是这样的),只需返回false即可。 - jahroy
非常正确,忽略了那个方面。我猜这个应用程序不会在对象中期望有很多实际值,如果是这样的话,这不会造成太大的伤害。 - Jordan Ramstad

0

你可以使用 lodash 的 every

const obj1 = { a: 1, b: 2, c: true };
const obj2 = { a: true, b: true, c: true }; 

_.every(obj1, true);  // false
_.every(obj2, true);  // true

这两个都会返回false。 - YuliaP stands with Ukraine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接