检查Javascript对象是否只包含错误的值

Check if Javascript Object only contains falsy values

本文关键字:错误 包含 Javascript 对象 是否 检查      更新时间:2023-09-26

我得到了一个这样的对象:

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。obj2obj3obj4具有至少一个为真的值。

有简单的解决方案吗?

作为一行:

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

您可以使用some函数:

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

对于每个对象:如果每个属性值都是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]

演示

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

所以这将做到

function isFalse(obj) {
  return Object
    .keys(obj)
    .every(function (k) {
      return !obj[k];
    });
}

请参阅jsFiddle以获取证据https://jsfiddle.net/0se3yh62/

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

const isObjectFilled = obj => Object.values(obj).filter(value => !!value).length > 0
isObjectFilled(obj1) // false
isObjectFilled(obj2) // true
isObjectFilled(obj3) // true
isObjectFilled(obj4) // true

"Object.values()方法返回给定对象自己的可枚举属性值的数组"(MDN)

一旦我有了这个值数组,我将通过删除每个错误的值来过滤它。

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

如果过滤后的数组的长度大于0,则意味着至少有一个对象的值是真实的。然后函数将返回true

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

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

function objIsFalsy(obj) {
    for(var i in obj) {
        if(obj[i]) return false;
    }
    return true;
}

按照以下步骤操作:-

  1. 将所有对象变量放在一个数组中
  2. 为上面的数组做一个foreach循环
  3. 在循环内部检查对象键的值

对象上的循环:

function isFalsyObj(obj) {
  for(var elt in obj) if (obj[elt]!=false) return false;
  return true;
}
var obj1 = {foo: false, bar: ''};
var obj2 = {foo: false, bar: '1'};
var obj3 = {foo: true,  bar: ''};
var obj4 = {foo: true,  bar: '1'};
console.log(isFalsyObj(obj1));//true
console.log(isFalsyObj(obj2));//false
console.log(isFalsyObj(obj3));//false
console.log(isFalsyObj(obj4));//false

检查此

isvalidObj(obj1);//错误

isvalidObj(obj2);//真实

function isvalidObj(obj){
    for(var i in obj){ 
      if(obj[i]) return true;
    }
    return false;
}