Combine two arrays on primary key and foreign key

Viewed 437

I have two arrays like this:

let event = [
              {id: "123", ename: "abc"}
              {id: "125", ename: "def"}
            ]
let speaker = [
               {id: "11", sname: "s1", event_id: "123"}, //FK from event table
               {id: "13", sname: "s2", event_id: "123"}, 
               {id: "15", name: "s4", event_id: "125"}
            ]

I want output like this:

let event_speaker = [
                       {
                         id: "123", 
                         ename: "abc", 
                         speaker: [
                             {id: "11", sname: "s1", event_id: "123"},
                             {id: "13", sname: "s2", event_id: "123"}, 
                         ]
                       },
                       {
                         id: "125", 
                         ename: "def", 
                         speaker: [
                             {id: "15", sname: "s4", event_id: "125"} 
                         ]
                       }
                   ]

I have tried different answers which work to merge two arrays into one but not when we have more than one matching pair and I need to put it in a new array with my own key (speaker).

I have tried this:

let arr3 = arr1.map((item, i) => Object.assign({}, item, arr2[i]));

But it only works for one speaker as it puts all speaker keys into final array like this

let final_array = [
     id: "123",
     ename: "abc,
    sname: "s1",
    event_id: "123"

]
2 Answers

You can do this with map and filter methods. You just need to filter speaker array with id of the current element in event.

let event = [{"id":"123","ename":"abc"},{"id":"125","ename":"def"}]
let speaker = [{"id":"11","sname":"s1","event_id":"123"},{"id":"13","sname":"s2","event_id":"123"},{"id":"15","name":"s4","event_id":"125"}]

const event_speaker = event.map(({ id, ...rest }) => ({
  id, ...rest, speaker: speaker.filter(({ event_id }) => event_id === id)
}))

console.log(event_speaker)

You can use object destructing as well:

let event = [
              {id: "123", ename: "abc"},
              {id: "125", ename: "def"}
            ]
let speaker = [
               {id: "11", sname: "s1", event_id: "123"}, //FK from event table
               {id: "13", sname: "s2", event_id: "123"}, 
               {id: "15", name: "s4", event_id: "125"}
               ]
let result = event.map(e => ({...e,speaker: speaker.filter(({event_id}) => event_id === e.id)}))

console.log(result)

Related