Merging 2 arrays of same primary IDs

Viewed 54

I want to merge these 2 arrays that have the same id (box_id)

const boxes = [
  { box_id: 1, box_name: "Box 1" },
  { box_id: 2, box_name: "Box 2" },
];

const box_settings = [
  { box_id: 1, box_name: "Box 1", box_settings_id: 1, box_number_of_people: 2, box_total_price: 368 },
  { box_id: 1, box_name: "Box 1", box_settings_id: 2, box_number_of_people: 4, box_total_price: 736 },
  { box_id: 2, box_name: "Box 2", box_settings_id: 3, box_number_of_people: 2, box_total_price: 400 },
  { box_id: 2, box_name: "Box 2", box_settings_id: 4, box_number_of_people: 4, box_total_price: 800 },
];

Into this:

[
  {
    box_id: 1,
    box_name: "Box 1",
    box_settings: [
      { box_settings_id: 1, box_number_of_people: 2, box_total_price: 368 },
      { box_settings_id: 2, box_number_of_people: 4, box_total_price: 736 },
    ],
  },
  {
    box_id: 2,
    box_name: "Box 2",
    box_settings: [
      { box_settings_id: 3, box_number_of_people: 2, box_total_price: 400 },
      { box_settings_id: 4, box_number_of_people: 4, box_total_price: 800 },
    ],
  },
];

Thanks in advance. These are arrays produced by MySQL query.

2 Answers

you can use map to return expected array object

const boxes = [
  { box_id: 1, box_name: "Box 1" },
  { box_id: 2, box_name: "Box 2" },
];
const box_settings = [
  { box_id: 1, box_name: "Box 1", box_settings_id: 1, box_number_of_people: 2, box_total_price: 368 },
  { box_id: 1, box_name: "Box 1", box_settings_id: 2, box_number_of_people: 4, box_total_price: 736 },
  { box_id: 2, box_name: "Box 2", box_settings_id: 3, box_number_of_people: 2, box_total_price: 400 },
  { box_id: 2, box_name: "Box 2", box_settings_id: 4, box_number_of_people: 4, box_total_price: 800 },
];

var result=boxes.map(x=>{
  return { 
    box_id:x.box_id,
    box_name:x.box_name ,
    box_settings:(box_settings.filter(y=>y.box_id==x.box_id))
    .map(a=> { 
      return{
         box_settings_id:a.box_settings_id ,
         box_number_of_people:a.box_number_of_people,
         box_total_price:a.box_total_price
       }
    })      
  }
})
console.log(result);

You can map it, and inside that apply filter

var box_settings = [ { box_id: 1, box_name: "Box 1", box_settings_id: 1, box_number_of_people: 2, box_total_price: 368 }, { box_id: 1, box_name: "Box 1", box_settings_id: 2, box_number_of_people: 4, box_total_price: 736 }, { box_id: 2, box_name: "Box 2", box_settings_id: 3, box_number_of_people: 2, box_total_price: 400 }, { box_id: 2, box_name: "Box 2", box_settings_id: 4, box_number_of_people: 4, box_total_price: 800 }];
var boxes = [ { box_id: 1, box_name: "Box 1" }, { box_id: 2, box_name: "Box 2" },];

var result = boxes.map(val=>{
 val.box_settings = box_settings.filter(({box_id})=>box_id==val.box_id).map(({box_id, box_name,...rest})=>rest);
 return val
});
console.log(result);

Related