Идентификатор фильтра в массиве объектов на основе массива идентификаторов

#javascript #arrays #ecmascript-6 #filter

#javascript #массивы #ecmascript-6 #Фильтр

Вопрос:

Я пытаюсь отобразить значок сердца для элементов, которые добавлены в список пожеланий. Я использую локальное хранилище для сохранения элементов, внесенных в список желаемых. У меня есть массив идентификаторов, таких как wishlistIds = [123,425,212,512,516] . Итак, я хочу проверить, совпадает ли идентификатор в этом массиве с массивом объектов (которые являются продуктами). Массив объектов продукта выглядит следующим образом;

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

Я пытался использовать метод Array.filter для достижения того, чего я хочу, но не смог заставить его работать;

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

Приведенный выше код возвращает мне все идентификаторы внутри списков желаний без фильтрации идентификаторов внутри элементов. Как правильно подойти к этой проблеме?

Комментарии:

1. items является массивом. У него нет id свойства.

2. Вы хотите получить пересечение обоих списков? Т.Е. идентификаторы всех продуктов, которые находятся в списке желаемых и в текущем наборе элементов?

3. @RubenHelsloot правильно

4. вероятно, одним из решений является wishlistIds.filter(w =>items.find(item => w.id === item.id) > 0)

Ответ №1:

Создайте набор идентификаторов элементов и используйте его для фильтрации массива списков пожеланий

 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) 

Я использую a 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:

Сначала отфильтруйте список, затем сопоставьте его, чтобы получить только идентификатор

 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)