如何检查和对象是否为空(深)?

时间:2018-07-06 09:42:11

标签: javascript lodash

为此:

var lists:{
  item1:{}
  ,item2:{}
  ,item3:{}
  ,item4:{}
}

由于它基本上是空的,所以我需要一个函数(可能但不一定是_lodash一个)来检查它并说它是空的。

类似

is_empty(lists) // >> true (because every property resolves to an empty object)

如何?

3 个答案:

答案 0 :(得分:3)

您可以遍历对象的值并检查所有值是否为空:

var lists = {
  item1:{},
  item2:{},
  item3:{},
  item4:{}
}

//ES6:
function isEmpty(obj) {
    return Object.keys(obj).every(k => !Object.keys(obj[k]).length)
}

console.log(isEmpty(lists));

// ES5
function isEmpty(obj) {
    return Object.keys(obj).every(function(k) {
        return !Object.keys(obj[k]).length}
    )
}

console.log(isEmpty(lists));

答案 1 :(得分:2)

如果lists始终是对象的对象,则可以使用Object.values遍历所有值,并检查每个值(内部对象)是否没有键:

const isEmpty = outer => Object.values(outer).every(
  inner => Object.keys(inner).length === 0
);

var lists = {
  item1:{}
  ,item2:{}
  ,item3:{}
  ,item4:{}
}
var lists2 = {
  item1:{}
  ,item2:{}
  ,item3:{}
  ,item4:{}
  ,item5:{ foo: 'bar' }
}
console.log(isEmpty(lists));
console.log(isEmpty(lists2));

答案 2 :(得分:0)

此解决方案可检查是否永久嵌套了对象。 注意:这会将空字符串''和布尔值false都视为空。如果您需要特殊的支撑,可以在下面的代码中进行一些调整。

const isDeeplyEmpty = item => {
  if(typeof item === 'boolean') return !item;
  else if(typeof item === 'number') return false;
  else if(typeof item === 'object') {
    return Object.keys(item).every(k => {
      if(['object', 'boolean', 'number'].includes(typeof item[k])) {
        return isDeeplyEmpty(item[k]);
      }
      return _.isEmpty(item[k]);
    })
  }
  return !item;
};