【问题标题】:Filter using lodash使用 lodash 过滤
【发布时间】:2021-07-14 19:32:19
【问题描述】:

如果没有相同类型和格式的元素,我想将元素添加到数组中。 我用 for 循环做的,但看起来很糟糕。

for (i = 0; i < this.model.array.length; i++) {
      const selectedElement = this.model.array[ i ]
      if (selectedElement.value.format === item.value.format && selectedElement.value.type === item.value.type) {
        this.model.array.splice(i, 1)
        this.model.array.push(item)
        break
      }
      if (i === this.model.array.length - 1) {
        this.model.array.push(item)
      }
    }

你能告诉我怎么做这个 lodash 过滤器吗? 我尝试过这样的事情:

let filter = _.filter(this.model.array, function (o) {
      return ((o.value.type !== item.value.type) && (o.value.format !== item.value.format)) })

但它不起作用,它每次都返回 0 数组。 我的想法是过滤这些类型和格式与项目相同的元素(但它只是一个),然后使用这个过滤后的数组推送一些东西。 或者如果满足条件,也许还有另一种方法可以添加元素?

项目如下所示:

【问题讨论】:

  • 提供数据甚至更好,一个可运行的例子
  • @Vulwsztyn 嘿,我发布了项目的结构。
  • 在我看来你需要 || 而不是 &amp;&amp; - 当我认为你真正需要的是(不是 A)和(不是 B)== 不是(A 或 B)时not(A and B) which == (not A) or (not B)
  • @Alnitak 是的,就是这样。非常感谢!
  • 换句话说,您希望保留两个(否定)条件中任何一个都失败的元素,而不是两者都失败的元素。

标签: javascript vue.js lodash


【解决方案1】:

您的过滤器中有错误的布尔运算。

考虑在循环中查找匹配条目的原始条件:

selectedElement.value.format === item.value.format && selectedElement.value.type === item.value.type

让我们将这两个测试(或“谓词”)称为 AB,这样表达式就可以简化为:

A && B

在您的filter 调用中,您希望保留 匹配的条目,即:

!(A && B)

De Morgan's Laws 说的相当于:

!A || !B

然而你实际写的是:

!A && !B

相当于:

!(A || B)

【讨论】:

    猜你喜欢
    • 2021-09-30
    • 2019-03-10
    • 2016-11-17
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    相关资源
    最近更新 更多