【问题标题】:Filter id in an array of object based on an array of id's根据 id 数组过滤对象数组中的 id
【发布时间】:2022-01-12 02:34:06
【问题描述】:

我正在尝试为添加到愿望清单的项目显示心形图标。我正在使用本地存储来保存愿望清单中的项目。我有一个 id 数组,例如 wishlistIds = [123,425,212,512,516]。所以我想检查该数组中的 id 是否与对象数组(即产品)匹配。对象的产品数组如下所示;

 items = [{id:123, productName:"Cheese", price: 15.99}, {id:599, productName: "Honey", price:21.99}]

我一直在尝试使用 Array.filter 方法来实现我想要的,但无法实现;

wishlistIds.filter(w => w.id === items.id)

上面的代码返回了wishlistIds中的所有id,而不过滤项目中的id。解决这个问题的正确方法是什么?

【问题讨论】:

  • items 是一个数组。它没有id 属性。
  • 你想得到两个列表的交集吗? IE。在当前商品集中的所有商品的 ID?
  • @RubenHelsloot 正确
  • 可能一种解决方案是wishlistIds.filter(w =>items.find(item => w.id === item.id) > 0)

标签: javascript arrays ecmascript-6 filter


【解决方案1】:

创建一个包含项目 ID 的 Set 并使用它来过滤愿望清单数组

const wishlistIds = [123,425,212,512,516]
const items = [{id:123, productName:"Cheese", price: 15.99}, {id:599, productName: "Honey", price:21.99}]

const itemIds = new Set(items.map(({ id }) => id))

const filteredWishlist = wishlistIds.filter(id => itemIds.has(id))

console.log(filteredWishlist)

我在这里使用Set,因为Set.prototype.has() 的时间复杂度为O(1),而Array.prototype.includes() 的时间复杂度为O(n)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set#performance

【讨论】:

    【解决方案2】:

    首先过滤列表,然后映射它以仅获取 ID

    let wishlistIds = [123,425,212,512,516]
    let items = [{id:123, productName:"Cheese", price: 15.99}, {id:599, productName: "Honey", price:21.99}]
    let hearts = items.filter(w => wishlistIds.includes(w.id)).map(w => w.id)
    console.log(hearts)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      • 2020-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多