mne_web_dev
mne_web_dev

Reputation: 251

Filter array of objects with another array of objects and get new array of objects

I have two array of objects and I want to get a new one which is combination of those two.

const all_products = [ 
  {
   id : 1,
   name : "Coca Cola",
   price : 12.34
  },
 {
  id : 2,
  name : "Marbo Chips",
  price : 8.34
 },
 {
 id : 3,
 name : "Seven Days",
 price : 4.34
 },
{
id : 4,
name : "Lays",
price : 32.34
 },
{
id : 5,
name : "Pringles",
price : 2.34
}
 ];

And this one:

const shopping_cart = [
{
 id : 1,
 qty : 4
},
{
 id : 5,
 qty : 2
}
 ];

I want to filter through all_products array by comparing if id's are the same and want to add qty to that object and get this

new_arr = [
  {
  id: 1,
  name: "Coca Cola",
  price: 12.34,
  qty: 4
 }, {
  id: 5,
  name: "Pringles",
  price: 2.34,
  qty: 2
 }]

I've succeeded by using this

 const test = [];

  for( let one_product of all_products ) {
     for( let sc_item of shopping_cart ){
        if(one_product.id === sc_item.id){
          let it = {
                 ...one_product,
                 qty : sc_item.qty
         }
         test.push(it);
       }
      }
     }

But I want to do this by using js array functions like filter,some,reduce etc.

Upvotes: 1

Views: 75

Answers (3)

Kisaragi
Kisaragi

Reputation: 2218

If you want to keep the non matched entries:

 var merged = all_products.filter(function(a) {
  return shopping_cart.filter(function(b){
   if (a.id == b.id)
   {
   return Object.assign(a, b)
   }
  })
});

Upvotes: 0

JoxieMedina
JoxieMedina

Reputation: 1003

There you go

const all_products = [{
    id: 1,
    name: "Coca Cola",
    price: 12.34
  },
  {
    id: 2,
    name: "Marbo Chips",
    price: 8.34
  },
  {
    id: 3,
    name: "Seven Days",
    price: 4.34
  },
  {
    id: 4,
    name: "Lays",
    price: 32.34
  },
  {
    id: 5,
    name: "Pringles",
    price: 2.34
  }
];
const shopping_cart = [{
    id: 1,
    qty: 4
  },
  {
    id: 5,
    qty: 2
  }
];

const updatedCart = shopping_cart.map((item) => {
  const moreProductInfo = all_products.filter((product) => product.id === item.id)[0];
  return {
    ...item,
    ...moreProductInfo
  }
})

console.log(updatedCart)

Upvotes: 0

user15889308
user15889308

Reputation:

Hi,

This is your code

const all_products = [ 
  {
   id : 1,
   name : "Coca Cola",
   price : 12.34
  },
 {
  id : 2,
  name : "Marbo Chips",
  price : 8.34
 },
 {
 id : 3,
 name : "Seven Days",
 price : 4.34
 },
{
id : 4,
name : "Lays",
price : 32.34
 },
{
id : 5,
name : "Pringles",
price : 2.34
}
 ];
const shopping_cart = [
  {
   id : 1,
   qty : 4
  },
  {
   id : 5,
   qty : 2
  }
   ];
   
const test = [];
all_products.forEach(one_product => {
   shopping_cart.forEach(sc_item => {
      if(one_product.id === sc_item.id){
        let it = {
           ...one_product,
           qty : sc_item.qty
        }
        test.push(it);
      }
   })
})
console.log(test)

Upvotes: 1

Related Questions