【问题标题】:How to check if an object is "deep empty"?如何检查对象是否“深空”?
【发布时间】:2016-04-12 13:30:10
【问题描述】:

我有一个方法可以返回一个包含 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 个项目。 你知道有什么方法可以检查一个对象是否“深空”吗?

【问题讨论】:

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


【解决方案1】:

这对我有用。它是递归的,负责处理所有嵌套对象(使用 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,会被认为是空的。

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

if(!obj) return true

【讨论】:

  • 不管怎样,这种方法也适用于 Underscore 而不是 Lodash。
【解决方案2】:

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

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

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

【讨论】:

  • 这不适用于深度嵌套,因为它需要递归,给定的解决方案只会深入一层。
猜你喜欢
  • 2013-10-11
  • 1970-01-01
  • 2019-06-09
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 1970-01-01
相关资源
最近更新 更多