【问题标题】:Vue / Lodash filter Array by another array's valuesVue / Lodash通过另一个数组的值过滤数组
【发布时间】:2021-09-04 14:07:38
【问题描述】:

我正在继续我的 JavaScript 学习,但遇到了一些我不清楚要解决的问题。

在我的 Vue 数据对象中,我有:

  data: {
    allergenFilter: [],
    categoryFilter: [],
    results: {},
  },

我有一组复选框,可以让我为产品选择过敏原,它会像这样填充我的 allergenFilter Vue 属性:

[
  0: "nut-free",
  1: "milk-free"
]

但我也有一个产品有/没有的过敏原列表,我想匹配包含这些选项的产品。这是一个产品的例子:

[
  0:"vegetarian"
  1:"vegan"
  2:"egg-free"
  3:"nut-free"
]

我试图通过这样做来过滤结果:

  this.results.filter(result =>
    result.allergens.includes(
      this.allergenFilter
    )
  )

但由于键:值配对,它不起作用,所以我知道这个问题,但我不完全确定如何查看数组值是否包含在另一个数组的值中

【问题讨论】:

    标签: javascript arrays vue.js


    【解决方案1】:

    您需要另一个嵌套循环 - 检查.some 的过敏原是否包含在allergenFilter 中。

    this.results.filter(result =>
        result.allergens.some(
            allergen => this.allergenFilter.includes(allergen)
        )
    )
    

    如果您需要全部包含allergenFilter,请使用.every

    this.results.filter(result =>
        this.allergenFilter.every(
            allergen => result.allergens.includes(allergen)
        )
    );
    

    【讨论】:

    • .every 效果很好,非常感谢。虽然当我使用您的第一个答案时,我似乎确实收到了 some() is not a function 错误
    • result.allergens 是一个数组吗?如果是这样,它应该工作。您的代码有[ 0: "nut-free", 1: "milk-free" ],这是无效的语法,但看起来有点像数组。数组字面量没有键值对,只有值,Array.prototype.some 存在。
    • 是的,键值对。如果我复制您的第二个答案并将every 更改为some 它可以工作,所以不确定第一个答案中是否存在真正的语法错误?
    • .every 肯定是我需要的答案,但只是.some 答案上的一个仅供参考
    • 是的,你[ 0: "nut-free", 1: "milk-free" ]的代码肯定是语法错误,试试看:const someArr = [ 0: "nut-free", 1: "milk-free" ]会抛出
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 2017-02-24
    • 2020-11-25
    • 1970-01-01
    相关资源
    最近更新 更多