检查Javascript对象是否仅包含falsy值

检查Javascript对象是否仅包含falsy值,javascript,object,Javascript,Object,我得到了这样一个物体: var obj1 = {foo: false, bar: ''}; var obj2 = {foo: false, bar: '1'}; var obj3 = {foo: true, bar: ''}; var obj4 = {foo: true, bar: '1'}; 我想要一个简单的函数来检查这些对象的所有值是否为false。在此给定示例中,只有obj1应触发false,因为其所有值均为falseobj2,obj3和obj4至少拥有一个为真的值 有简单的解决方案

我得到了这样一个物体:

var obj1 = {foo: false, bar: ''};
var obj2 = {foo: false, bar: '1'};
var obj3 = {foo: true,  bar: ''};
var obj4 = {foo: true,  bar: '1'};
我想要一个简单的函数来检查这些对象的所有值是否为false。在此给定示例中,只有obj1应触发false,因为其所有值均为false
obj2
obj3
obj4
至少拥有一个为真的值

有简单的解决方案吗?

作为一个线性系统:

!Object.keys(obj1).some(function(k) {return obj1[k];});
// Array.some returns true if any callback returns true
// You want true if all return false, aka if none return true
// So just negate Array.some
作为一种更具可读性的方法:

var ok = true, k;
for( k in obj1) if( obj1.hasOwnProperty(k)) {
    if( obj1[k]) {
        ok = false;
        break;
    }
}

我假设您想要一个可以在任何对象上工作的动态函数,那么只迭代对象的所有索引怎么样

function objIsFalsy(obj) {
    for(var i in obj) {
        if(obj[i]) return false;
    }
    return true;
}
遵循以下步骤:-

  • 将所有对象变量放入一个数组中
  • 为上面的数组创建一个foreach循环
  • 在循环内部检查对象键的值
  • 在对象上循环:

    函数isFalsyObj(obj){
    如果(obj[elt]!=false)返回false,则为(obj中的var elt);
    返回true;
    }
    var obj1={foo:false,条:''};
    var obj2={foo:false,bar:'1'};
    var obj3={foo:true,条:''};
    var obj4={foo:true,bar:'1'};
    console.log(isFalsyObj(obj1))//真的
    console.log(isFalsyObj(obj2))//假的
    console.log(isFalsyObj(obj3))//假的
    
    console.log(isFalsyObj(obj4))//false
    您可以使用以下功能:

    [ob1, ob2, ob3, obj4].some(function(obj) { return obj.foo })
    

    的其他实现存在一个缺陷。some()
    您希望在所有属性都是虚假值的情况下返回值,而不仅仅是在任何属性根据OP要求都是虚假值的情况下

    这样就行了

    function isFalse(obj) {
      return Object
        .keys(obj)
        .every(function (k) {
          return !obj[k];
        });
    }
    
    请参阅jsFiddle以获取证据


    Object.keys的另一个好处是它只返回自己的属性,因此您不必在手动循环中进行检查。

    对于每个对象:如果每个属性值都是
    false
    返回
    false
    ,否则
    true

    var out = [obj1, obj2, obj3, obj4].map(function (obj) {
      return !Object.keys(obj).every(function (p) {
        return !obj[p];
      })
    }); // [false, true, true, true]
    

    检查此项

    isvalidObj(obj1);//假的

    isvalidObj(obj2);//真的

    “Object.values()方法返回给定对象自身可枚举属性值的数组”()

    一旦我得到了这个值数组,我将通过删除每个falsy值来过滤它

    .filter(value=>!!value)
    将通过仅返回truthy值来过滤数组

    如果过滤数组的长度大于0,则表示至少有一个对象的值为truthy。然后该函数将返回
    true


    如果过滤后的数组为空,则表示对象的所有值都是假的。然后函数将返回
    false

    欢迎使用Stackoverflow!请编辑您的答案,并解释一下您正在做什么,有关更多提示,请参阅。
    function isvalidObj(obj){
        for(var i in obj){ 
          if(obj[i]) return true;
        }
        return false;
    }
    
    const isObjectFilled = obj => Object.values(obj).filter(value => !!value).length > 0
    
    isObjectFilled(obj1) // false
    isObjectFilled(obj2) // true
    isObjectFilled(obj3) // true
    isObjectFilled(obj4) // true