JavaScript merging objects by id JavaScript merging objects by id arrays arrays

JavaScript merging objects by id


This should do the trick:

var mergedList = _.map(a1, function(item){    return _.extend(item, _.findWhere(a2, { id: item.id }));});

This assumes that the id of the second object in a1 should be 2 rather than "2"


Short ES6 solution

const a3 = a1.map(t1 => ({...t1, ...a2.find(t2 => t2.id === t1.id)}))


Assuming IDs are strings and the order does not matter, you can

  1. Create a hash table.
  2. Iterate both arrays and store the data in the hash table, indexed by the ID. If there already is some data with that ID, update it with Object.assign (ES6, can be polyfilled).
  3. Get an array with the values of the hash map.
var hash = Object.create(null);a1.concat(a2).forEach(function(obj) {    hash[obj.id] = Object.assign(hash[obj.id] || {}, obj);});var a3 = Object.keys(hash).map(function(key) {    return hash[key];});

In ECMAScript6, if the IDs are not necessarily strings, you can use Map:

var hash = new Map();a1.concat(a2).forEach(function(obj) {    hash.set(obj.id, Object.assign(hash.get(obj.id) || {}, obj))});var a3 = Array.from(hash.values());