2015-03-28 5 views
2

Как объединить два массива объектов в одном массиве, заданный массив объектов, как показано ниже.Как слить два массива объектов в javascript

var arr1=[{key:2000,value:100},{key:2001,value:200},{key:3000,value:300}] 
var arr2=[{key1:2000,value1:100},{key1:2001,value1:200},{key1:3000,value1:300}] 

Ожидаемый результат:

[ 
    { 
    "key": 2000, 
    "value": 100, 
    "child": [ 
     { 
     "key1": 2000, 
     "value1": 100 
     } 
    ] 
    }, 
    { 
    "key": 2001, 
    "value": 200, 
    "child": [ 
     { 
     "key1": 2001, 
     "value1": 200 
     } 
    ] 
    }, 
    { 
    "key": 3000, 
    "value": 300, 
    "child": [ 
     { 
     "key1": 3000, 
     "value1": 300 
     } 
    ] 
    } 
] 
+0

будут ли два массива всегда содержать объекты с теми же клавишами? в том же порядке? – Andbdrew

ответ

2

ОБНОВЛЕНО: Как некоторые другие люди уже упоминался, вы можете перебрать первый массив и присвоить соответствующий элемент второго массива к дочернему свойству соответствующего объекта в первом массиве, или вы можете использовать Array.prototype.map

, например:

var newArray = arr1.map(function(cur, idx) { 
    cur.child = [arr2[idx]]; 
    return cur; 
}); 

Следует отметить, что это (и другие упомянутые решения) зависят от обоих массивов, содержащих одни и те же ключи, и что они оба сортируются с помощью ключа объекта.

Если вы не уверены, что массивы будут отсортированы по ключу, вам придется выполнить некоторую предварительную обработку. Вы можете отсортировать оба массива первых (это еще хрупок, потому что нет никаких гарантий того, что ключи в обоих массивах являются одинаковыми), или сделать что-то вроде:

var secondGroupByKey = {}; 
for (var i=0; i<arr2.length; i++) { 
    secondGroupByKey[arr2[i].key1] = arr2[i]; 
} 

, а затем вы можете смело сказать:

var key; 
for (var j=0; j<arr1.length; j++) { 
    key = arr1[j].key; 
    if (secondGroupByKey[key] !== undefined) { 
     arr1[j].child = [secondGroupByKey[key]]; 
    } 
} 

Этот подход более безопасен, чем полагаться на порядок массивов, но он поставляется со стоимостью итерации по обеим массивам вместо одного. Вы также можете захотеть выбросить исключение или выручить другим способом, если найдете в arr1 ключ, которого нет в arr2.

+0

Почему это downvote ?? – balteo

+0

oh достаточно уверен. название вопроса обмануло меня! – Andbdrew

+0

Я написал, что приведено ниже function funData() {var arr = []; \t \t \t для (вар я в данных) { \t \t \t для (вар J в data1) { \t \t \t arr.push (data1 [J]) \t \t \t данных [I].c1 = обр; \t \t \t} \t \t \t} \t \t \t возврата данных; \t \t \t} –

1

Пропустите первый массив и назначьте соответствующее значение из второго массива в child каждого объекта первого массива.

for(var i = 0;i<arr1.length;i++){ 
    arr1[i].child=[arr2[i]]; 
} 
+0

Следует отметить, что это работает только в том случае, если массивы отсортированы по объектным ключам, и если они содержат только объекты с одинаковыми ключами. – Andbdrew

1
arr2.forEach(function(obj, i) { 
    arr1[ i ].child = [ obj ]; 
}); 
0

Если я правильно понял, что вам нужно положить п-й элемент массива В качестве свойства «ребенка» объекта с тем же индексом в массиве А; вот моя попытка:

function addChildren(master, child){ 
    return master.map(function(elem, i){ 
     elem.child = elem.child || []; 
     elem.child.push(child[i]); 
     return elem; 
    }); 
}; 

JSFiddle demo.

Смежные вопросы