#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)