【问题标题】:How to check if object is empty using lodash _isEmpty?如何使用 lodash _isEmpty 检查对象是否为空?
【发布时间】:2019-07-09 16:03:53
【问题描述】:

如果我检查数组_isEmpty,我现在有映射函数返回数组的空对象,这个条件应该满足,但它没有进入 if 语句。知道什么是错误的或更好的方法吗?

main.js

const validateResponse = _.map(drugs ,validateValues);

现在 validateResponse 返回 [{}] 并且它应该满足条件

  if (_.isEmpty(validateResponse)) {
      throw invalidPriceError;
    }

【问题讨论】:

  • 那么问题是如何检测[{}]
  • @danh 没错
  • _.some(validateResponse, _.isEmpty) 似乎很接近,但不确定您要如何处理长度为 != 1 的数组

标签: javascript arrays angular lodash


【解决方案1】:

根据 lodash 文档here

类似数组的值,例如参数对象、数组、缓冲区、字符串或类似 jQuery 的集合,如果长度为 0,则视为空。类似地,如果映射和集合的大小为 0,则视为空。

[{}].length 恰好是 1。如果你愿意的话,一盒卷心菜。一个包含一个空对象的数组。因此, isEmpty 的计算结果为 false。另一方面,[].length 等于 0。

【讨论】:

  • 好吧,那么在这个用例中我将如何检查这样的数组?
  • 我的回答是基于这个问题的标题。听起来您目前的解决方案不需要_isEmpty。我建议更新问题的标题。或者,如果可能的话,有一些方法可以用 _isEmpty 认为是空的东西来填充 validateResponse
  • 也许对空对象进行一些检测会有所帮助,这里有一个问题:stackoverflow.com/questions/679915/…
【解决方案2】:

您必须精简内部结构或更深入地检查一个级别:

if (!validateResponse.filter(r => !_.isEmpty(r)).length){
  throw invalidPriceError;
}

【讨论】:

  • 仍然没有评估为真
  • 我把逻辑颠倒了,用!修复。
【解决方案3】:

可能还有一些您想要涵盖的其他情况,例如空数组或两个空对象的数组等。以下变体应该可以满足您的需要...

let array = [{}];
// contains any empty object
console.log(_.some(array, _.isEmpty))

// contains only empty objects
console.log(_.every(array, _.isEmpty))

// contains exactly one empty object
console.log(_.every(array, _.isEmpty) && array.length == 1)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.core.js"></script>

【讨论】:

    【解决方案4】:

    如果您只想检查是否有一个带有单个空对象的数组[{}],您可以使用_.isEqual

    const hasEmpty = arr => _.isEqual(arr, [{}])
    
    console.log(hasEmpty([])) // false
    console.log(hasEmpty([{}])) // true
    console.log(hasEmpty([{}, {}])) // false
    console.log(hasEmpty([{ a: 1 }])) // false
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

    【讨论】:

      【解决方案5】:

      由于数组实际上不是空的,但您真正要检查的是“数组是否只有一个值,并且该单个值是一个空对象吗?”,您可以进行以下检查:

      if (validateResponse.length === 1 && _.isEmpty(validateResponse[0])) {
            throw invalidPriceError;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-19
        • 2013-10-11
        • 1970-01-01
        • 2019-06-09
        • 2013-02-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多