如何检查对象是否“深空”?

时间:2016-04-12 13:30:11

标签: javascript object nested underscore.js is-empty

我有一个返回包含4个对象的对象的方法:

function getFiles() {
    var documents = {};

    documents.files1ToBeCompleted = DocumentsService.getFiles1Uncompleted();
    documents.files2ToBeCompleted = DocumentsService.getFiles2Uncompleted();
    documents.files3ToBeCompleted = DocumentsService.getFiles3Uncompleted();
    documents.files4ToBeCompleted = DocumentsService.getFiles4Uncompleted();

    return documents;
}

我正在尝试使用下划线函数._isEmpty来验证对象是否为空,我的意思是我得到一个带有空子对象的对象。 但即使它的所有4个对象都是空的,它也不是空的,因为它包含4个项目。 你知道有什么方法可以检查一个物体是否“深空”?

2 个答案:

答案 0 :(得分:0)

这对我有用。它是递归的,并会处理所有嵌套对象(使用lodash)。

function isEmptyDeep(obj) {
  if(isObject(obj)) {
    if(Object.keys(obj).length === 0) return true
    return every(map(obj, v => isEmptyDeep(v)))
  } else if(isString(obj)) {
    return !obj.length
  }
  return false
}

它首先检查是否没有键,并在这种情况下返回true。

然后检查密钥并在每个密钥上运行isEmptyDeep。如果该值是一个对象(或数组),它将继续递归。

如果有一个空数组或空字符串,则长度将为0,并将被视为空。

如果该值为0false或其他虚假值,则将其视为不为空。如果您想将虚假值视为空,则将其作为上述函数的第一行:

if(!obj) return true

答案 1 :(得分:-3)

感谢Bergi引导我找到这个有效的解决方案:

_.every(documentsObject, function(property) { return _.isEmpty(property); });

如果对象为“深空”,则返回true,否则返回false