3

I am trying to display Heart icon for the items that are added to the Wishlist. I am using local storage to save the items that are wishlisted. I have an array of id's such as wishlistIds = [123,425,212,512,516]. So I want to check if the id's in that array matches with the array of objects (which are the products). Product array of objects looks like this;

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

I have been trying to use Array.filter method to achieve what I want, but couldn't make it work;

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

The above code returns me all the ids inside the wishlistIds without filtering the id's inside the the items. What is the correct way to approach this problem?

4
  • 1
    items is an array. It has no id property. Commented Dec 6, 2021 at 23:07
  • Do you want to get the intersection of both lists? I.e. the ids of all products that are wishlisted and in the current set of items? Commented Dec 6, 2021 at 23:07
  • @RubenHelsloot correct Commented Dec 6, 2021 at 23:09
  • 1
    probably one solution is wishlistIds.filter(w =>items.find(item => w.id === item.id) > 0) Commented Dec 6, 2021 at 23:11

2 Answers 2

3

Create a Set of item IDs and use that to filter the wishlist array

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)

I'm using a Set here as Set.prototype.has() is O(1) time complexity as opposed to Array.prototype.includes() which is O(n).

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

Sign up to request clarification or add additional context in comments.

Comments

2

First filter the list, then map it to get just the 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)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.