Search code examples
javascriptnode.jsarraysexpresslodash

How to merge these two arrays in nodejs


Array 1:

[
  { _id: '01', user: 0, vendor: 1, driver: 0 },
  { _id: '04', user: 2, vendor: 15, driver: 2 },
  { _id: '05', user: 24, vendor: 10, driver: 1 },
  { _id: '06', user: 0, vendor: 18, driver: 0 }
]

Array 2:

[
  { _id: '04', order: 20 },
  { _id: '05', order: 28 },
  { _id: '06', order: 3 },
  { _id: '08', order: 1 }
]

I need output like this

[
  { _id: '01', user: 0, vendor: 1, driver: 0 },
  { _id: '04', user: 2, vendor: 15, driver: 2, order: 20 },
  { _id: '05', user: 24, vendor: 10, driver: 1, order: 28 },
  { _id: '06', user: 0, vendor: 18, driver: 0, order: 3 },
  { _id: '08', user: 0, vendor: 0, driver: 0, order: 1 }
]

I am using lodash to merge array,

let merge = _.merge(arr1, arr2);

but, getting this output like this

 [
  { _id: '04', user: 0, vendor: 1, driver: 0, order: 20 },
  { _id: '05', user: 2, vendor: 15, driver: 2, order: 28 },
  { _id: '06', user: 24, vendor: 10, driver: 1, order: 4 },
  { _id: '06', user: 0, vendor: 18, driver: 0 }
]

please help me to do that


Solution

  • You can achieve this result using map and find

    const arr1 = [
      { _id: "01", user: 0, vendor: 1, driver: 0 },
      { _id: "04", user: 2, vendor: 15, driver: 2 },
      { _id: "05", user: 24, vendor: 10, driver: 1 },
      { _id: "06", user: 0, vendor: 18, driver: 0 },
    ];
    
    const arr2 = [
      { _id: "04", order: 20 },
      { _id: "05", order: 28 },
      { _id: "06", order: 4 },
    ];
    
    const result = arr1.map((obj) => {
      const objInArr2 = arr2.find((o) => o._id === obj._id);
      if (objInArr2) return { ...obj, ...objInArr2 };
      else return { ...obj };
    });
    
    console.log(result);

    EDIT: If some object exists in arr2 but not in arr1

    const arr1 = [
      { _id: "01", user: 0, vendor: 1, driver: 0 },
      { _id: "04", user: 2, vendor: 15, driver: 2 },
      { _id: "05", user: 24, vendor: 10, driver: 1 },
      { _id: "06", user: 0, vendor: 18, driver: 0 },
    ];
    
    const arr2 = [
      { _id: "04", order: 20 },
      { _id: "05", order: 28 },
      { _id: "06", order: 3 },
      { _id: "08", order: 1 },
    ];
    
    const result = arr1.map((obj) => {
      const objInArr2 = arr2.find((o) => o._id === obj._id);
      if (objInArr2) return { ...obj, ...objInArr2 };
      else return { ...obj };
    });
    
    arr2.forEach((obj) => {
      const isExist = result.find((o) => o._id === obj._id);
      if (!isExist) result.push({ user: 0, vendor: 0, driver: 0, ...obj });
    });
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }