Comparing two array of objects in JavaScript and update the values by comparing Keys

Viewed 46
var arr1 = [{"id": "15-1", "value": {"x": {"on": false}}}, 
           {"id": "15-2", "value": {"x": {"on": true}}}, 
           {"id": "15-3", "value": {"x": {"on": false}}},
           {"id": "15-4", "value": {"x": {"on": true}}}, 
           {"id": "16-2", "value": {"x": {"on": false}}} ]

var arr2 =[{"id": "16-1", "value": {"x": {"on": true}}}, 
           {"id": "16-2", "value": {"x": {"on": true}}} ]

Merge both the arrays and The id's which are similar should update their values as per the arr2
Here, we would like to get the final array as

finalArray = [{"id": "15-1", "value": {"x": {"on": false}}}, 
                  {"id": "15-2", "value": {"x": {"on": true}}}, 
                  {"id": "15-3", "value": {"x": {"on": false}}},
                  {"id": "15-4", "value": {"x": {"on": true}}}, 
                  {"id": "16-1", "value": {"x": {"on": true}}},
                  {"id": "16-2", "value": {"x": {"on": true}}} ]
2 Answers

Here is the solution to achieve the desired results:

var arr1 = [{"id": "15-1", "value": {"x": {"on": false}}}, 
           {"id": "15-2", "value": {"x": {"on": true}}}, 
           {"id": "15-3", "value": {"x": {"on": false}}},
           {"id": "15-4", "value": {"x": {"on": true}}}, 
           {"id": "16-2", "value": {"x": {"on": false}}} ]

var arr2 =[{"id": "16-1", "value": {"x": {"on": true}}}, 
           {"id": "16-2", "value": {"x": {"on": true}}} ]

const mergedArray = [...arr1, ...arr2];
const uniqueData = [...mergedArray.reduce((map, obj) => map.set(obj.id, obj), new Map()).values()];
console.log(uniqueData);

    var arr1 = [
  { id: "15-1", value: { x: { on: false } } },
  { id: "15-2", value: { x: { on: true } } },
  { id: "15-3", value: { x: { on: false } } },
  { id: "15-4", value: { x: { on: true } } },
  { id: "16-2", value: { x: { on: false } } },
];

var arr2 = [
  { id: "16-1", value: { x: { on: true } } },
  { id: "16-2", value: { x: { on: true } } },
];
function merge(a, b, prop) {
  var reduced = a.filter(aitem => !b.find(bitem => aitem[prop] === bitem[prop]))
  return reduced.concat(b);
}

console.log(merge(arr1,arr2,"id"));
Related