【问题标题】:Lodash - Check for empty array in an array of objects using _.someLodash - 使用 _.some 检查对象数组中的空数组
【发布时间】:2017-04-16 14:18:58
【问题描述】:

我有一个这样的对象数组 - 比如说 testArray。 我需要检查数组中的每个对象,如果任何 saveNumbers 数组为空,我的函数应该返回 false。

我的功能如下:

  public checkSaveNumbers(): boolean {
    let result;
    if (this.testArray) {
      result = _.some(this.testArray, member => !member.saveNumbers.length);
    }
    console.log(result);
  }

在这里,我上面的对象的结果显示为 true,我们可以看到数组中的第一个元素的 saveNumbers 数组为空。在这种情况下,我希望结果是错误的。我想使用 Lodash 来实现这一点,但我不确定这里出了什么问题。

更新:

按照 cmets 的建议,我将代码更改为:

public checkSaveNumbers(): boolean {
  let result = true;
  if (this.testArray) {
    result = _.every(this.testArray, member => member.saveNumbers.length > 0); //as soon as the condition is false, result should become false otherwise result will remain true.
    console.log(result);
  }
}

但是,使用此代码,即使我的 saveNumbers 数组对于 testArray 中的每个成员都不为空,我也会得到结果为 false。

【问题讨论】:

  • uhm.... .some 如果其中一个为真,则返回真。在你的情况下,其中一个是真的,所以结果将是真的......简单地否定它,或者使用.every并停止否定长度
  • 如果我否定它,即使 saveNumbers 不为空,它也总是返回 false。
  • .some 如果数组中的任何项目符合条件,则返回 true。您的条件是“数组为空”。所以result 将是真的,如果任何项目有一个空数组。你想要相反的,所以,否定result,或者使用.every
  • 我不明白为什么有人会否决这样的问题! @KevinB 我将代码更改为 result = _.every(this.selectedMembers, member => member.saveNumbers.length);现在,即使 saveNumbers 包含元素,结果也会显示为 false。
  • 不清楚。您的代码完全按照它应该做的,但是您期望得到不同的结果……所以您应该将其更改为具有预期的结果。我不明白问题出在哪里。

标签: javascript angularjs arrays lodash


【解决方案1】:

你可以重写你的函数如下:

function checkSaveNumber(testArray) {
    return !_.some(_.map(testArray, 'saveNumbers'), ['length', 0]);  
}

http://jsbin.com/domitexazo/edit?js,console

【讨论】:

    【解决方案2】:

    如果 saveNumbers 数组中的任何一个为空,我的函数应该返回 false。

    你试过了:

    _.some(array, member => !member.saveNumbers.length)
    

    但这意味着“如果至少有一个成员的 saveNumbers 为空,则 true”。这与您想要的完全相反。

    所以否定整个表达式

    !_.some(array, member => !member.saveNumbers.length)
    

    更新:

    如果这也不适合你:

    _.every(array, member => member.saveNumbers.length > 0)
    

    那么你在其他地方有一个错误。

    【讨论】:

    • 你是对的。尽管在日志中我看到我的数组包含值,但它仍然给我 _.every 错误。我认为这与我的 Angular 应用程序有关。感谢您的帮助。
    【解决方案3】:

    另一种变体

    !_.chain(testArray)
        .map('saveNumbers')
        .map(_.isEmpty)
        .some()
        .value()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      • 2016-08-06
      • 2017-02-22
      • 2018-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多