0

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

Nick
  • 689
  • 14
  • 27
  • You can merge the arrays and apply an answer from https://stackoverflow.com/questions/33850412/merge-javascript-objects-in-array-with-same-key – Thomas Sablik Jun 10 '21 at 11:17

4 Answers4

4

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; }
DecPK
  • 24,537
  • 6
  • 26
  • 42
1

let 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 }
];

let arr2 = [
  { _id: '04', order: 20 },
  { _id: '05', order: 28 },
  { _id: '06', order: 4 }
];

arr2.forEach(e => {
 let obj = arr1.find(a => a._id === e._id);
 if(obj)
  obj.order = e.order
});

console.log(arr1);
Vivek Bani
  • 3,703
  • 1
  • 9
  • 18
1

If you are using lodash, try to use mergeWith instead. Make sure customizer option is used.

Another way https://www.npmjs.com/search?q=merge%20deep

Nghiệp
  • 4,038
  • 2
  • 23
  • 27
0

Put the second array into a Map for efficient look ups by _id, then map first array

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 arr2Map = new Map(arr2.map(({_id,...r}) => [_id, r]))

const res = arr1.map(e => Object.assign({}, e, arr2Map.get(e._id)))

console.log(res)
charlietfl
  • 170,828
  • 13
  • 121
  • 150