【问题标题】:How to Check if Arrays in a Object Are All Empty? [duplicate]如何检查对象中的数组是否都是空的? [复制]
【发布时间】:2017-02-16 14:09:24
【问题描述】:

所以我需要传入一个对象,其中每个属性都是数组。该函数将使用每个数组中保存的信息,但我想通过检查每个数组是否为空/空来检查整个对象是否为空(不仅仅是没有属性)。到目前为止我所拥有的:

function isUnPopulatedObject(obj) { // checks if any of the object's values are falsy
    if (!obj) {
        return true;
    }

    for (var i = 0; i < obj.length; i++) {
        console.log(obj[i]);
        if (obj[i].length != 0) {
            return false;
        }    
    }

    return true;  
}

例如,这将导致上面是false

obj {
    0: Array[0]
    1: Array[1]
    2: Array[0]
}

虽然这是我正在检查的空白(确实如此):

obj {
    0: Array[0]
    1: Array[0]
    2: Array[0]
}

上面的代码不起作用。提前致谢。

【问题讨论】:

    标签: javascript arrays object


    【解决方案1】:

    因此,如果我们想遍历对象并查找该对象的每个键是否通过检查,我们可以使用 Object.keys 和 Array#extra every,如下所示:

    var allEmpty = Object.keys(obj).every(function(key){
    return obj[key].length === 0
    })
    

    这会将allEmpty 设置为布尔值(真/假),这取决于我们每次运行给定的检查obj[key].length === 0 是否返回真。

    此对象将 allEmpty 设置为 true:

    var obj = {
        0: [],
        1: [],
        2: []
    }
    

    虽然这会将其设置为 false:

    var obj = {
        0: [],
        1: [],
        2: [],
        3: [1]
    }
    

    【讨论】:

    • 谢谢!这是一个这样的解决方案,没有意识到对象没有像数组那样的长度。
    【解决方案2】:

    object 没有长度属性。还有其他几种方法可以遍历对象的值,您应该能够find

    要检查一个值是否为数组,可以使用Array.isArray

    例如:

    function objectIsEmpty(obj) {
        return Object.keys(obj).every(function(key) {
          var val = obj[key];  
          
          if (Array.isArray(val) && val.length === 0) {
            return true;
          }
          
          // Other rules go here:
          // ...
          
          return false;
        });
    };
    
    
    console.log(objectIsEmpty({ 0: [], 1: [], 2: [] }));
    console.log(objectIsEmpty({ 0: [], 1: [1], 2: [] }));

    【讨论】:

      【解决方案3】:

      开始使用镇上的新孩子可能会很有趣。 Object.values()

      var o1 = {0: [], 1: [1], 2: []},
          o2 = {0: [], 1: [], 2: []},
      chkObj = o => Object.values(o).every(a => a.length === 0);
      console.log(chkObj(o1));
      console.log(chkObj(o2));
      

      注意:这只适用于最新版本的 Chrome、Opera 和 FF

      【讨论】:

        【解决方案4】:

        它不起作用,因为您的对象没有 length 属性。

        试试这个简单的

        function isUnPopulatedObject(obj) { 
            return Object.keys( obj ).filter( function(key){
              return obj[ key ].length > 0;  //if any array has a property then filter will return this key.
            }).length == 0; //used == here since you want to check if all are empty
        }
        

        或使用every

        function isUnPopulatedObject(obj) { 
            return Object.keys( obj ).every( function(key){
              return obj[ key ].length == 0;  
            }); 
        }
        

        或使用some

        function isUnPopulatedObject(obj) { 
            return Object.keys( obj ).some( function(key){
              return obj[ key ].length > 0;  
            }) === false; 
        }
        

        【讨论】:

        • 对于布尔结果,您应该使用.every().some(),这样您就不会构建新数组,并且可以在可能的情况下提前终止。您使用的是 jQuery 缺陷的常见解决方法。
        • 使用.some() 代替过滤。它不会创建中间数组。
        • @squint every 似乎更好
        • @4castle 是的,有些人也会这样做
        • @LaLaLottie 很高兴为您提供帮助!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多