Search code examples
javascriptarraysinner-join

How can I perform an inner join with two object arrays in JavaScript?


I have two object arrays:

var a = [
  {id: 4, name: 'Greg'},
  {id: 1, name: 'David'},
  {id: 2, name: 'John'},
  {id: 3, name: 'Matt'},
]

var b = [
  {id: 5, name: 'Mathew', position: '1'},
  {id: 6, name: 'Gracia', position: '2'},
  {id: 2, name: 'John', position: '2'},
  {id: 3, name: 'Matt', position: '2'},
]

I want to do an inner join for these two arrays a and b, and create a third array like this (if the position property is not present, then it becomes null):

var result = [{
  {id: 4, name: 'Greg', position: null},
  {id: 1, name: 'David', position: null},
  {id: 5, name: 'Mathew', position: '1'},
  {id: 6, name: 'Gracia', position: '2'},
  {id: 2, name: 'John', position: '2'},
  {id: 3, name: 'Matt', position: '2'},
}]

My approach:

function innerJoinAB(a,b) {
    a.forEach(function(obj, index) {
        // Search through objects in first loop
        b.forEach(function(obj2,i2){
        // Find objects in 2nd loop
        // if obj1 is present in obj2 then push to result.
        });
    });
}

But the time complexity is O(N^2). How can I do it in O(N)? My friend told me that we can use reducers and Object.assign.

I'm not able to figure this out. Please help.


Solution

  • One of the ways how to solve it.

    const a = [
      {id: 4, name: 'Greg'},
      {id: 1, name: 'David'},
      {id: 2, name: 'John'},
      {id: 3, name: 'Matt'},
    ];
    
    const b = [
      {id: 5, name: 'Mathew', position: '1'},
      {id: 6, name: 'Gracia', position: '2'},
      {id: 2, name: 'John', position: '2'},
      {id: 3, name: 'Matt', position: '2'},
    ];
    
    const r = a.filter(({ id: idv }) => b.every(({ id: idc }) => idv !== idc));
    const newArr = b.concat(r).map((v) => v.position ? v : { ...v, position: null });
    
    console.log(JSON.stringify(newArr));
    .as-console-wrapper { max-height: 100% !important; top: 0; }