javascript – Merge two arrays with union fields of objects

Question:

Please tell me how to merge several arrays into one. Let's say I have the following arrays

var first = [
    { id: 1, name: 'first' },
    { id: 2, name: 'second' },
    { id: 3, name: 'third' }
]

var second = [
    { id: 2, filed: 'foo2' },
    { id: 3, field: 'foo3' },
    { id: 4, field: 'foo4' }
]

var third = [
    { id: 2, data: 'some2' },
    { id: 4, data: 'some4' },
    { id: 6, data: 'some6' }
]

I would like to combine them to get this result:

var result = [
    { id: 1, name: 'first',   field: undefined, data: undefined },
    { id: 2, name: 'second',  field: 'foo2',    data: 'some2' },
    { id: 3, name: 'third',   field: 'foo3',    data: undefined },
    { id: 4, name: undefined, field: 'foo4',    data: 'some4' },
    { id: 5, name: undefined, field: undefined, data: undefined },
    { id: 6, name: undefined, field: undefined, data: 'some6' }
]

How can I do that? Thanks in advance

Answer:

 function merge(){ var result = []; Array.prototype.forEach.call(arguments, function(arr){ // Проходимся по переданным агрументам, функция принимает неограниченное количество аргументов if(Array.isArray(arr)){ for(e in arr){ // Проходимся по всем e = arr[e]; // переданным объектам var tmp = {}, isAdd = true; result.some(function(i){ if(i.id == e.id){ tmp = i; // Если в массиве уже был объект с данным id, то берём его isAdd = false; // и запрещаем добавлять его в результат return true; } }); for(prop in e){ tmp[prop] = e[prop]; // Изменяем/добавляем свойства из переданного объекта } if(isAdd) result.push(tmp); } } }); return result; } var first = [ { id: 1, name: 'first' }, { id: 2, name: 'second' }, { id: 3, name: 'third' } ]; var second = [ { id: 2, filed: 'foo2' }, { id: 3, field: 'foo3' }, { id: 4, field: 'foo4' } ]; var third = [ { id: 2, data: 'some2' }, { id: 4, data: 'some4' }, { id: 6, data: 'some6' } ]; var res = merge(first, second, third); console.info(res); /* => [ { "id": 1, "name": "first" }, { "id": 2, "name": "second", "filed": "foo2", "data": "some2" }, { "id": 3, "name": "third", "field": "foo3" }, { "id": 4, "field": "foo4", "data": "some4" }, { "id": 6, "data": "some6" }, length: 5 ] */
Scroll to Top