2017-02-12 2 views
2

У меня есть два массива, которые я хочу объединить.Слияние двух массивов объектов и их свойств

var arrayOne = [{id:1},{id:2}]; 
var arrayTwo = [{age: 20}, {age: 25}, {age: 22}]; 

Merged массив должен быть, как этот

[{id:1, age: 20}, {id:2, age: 25}, {age: 22}] 

Я попытался _.zip метод из библиотеки подчеркивания, но сливает только массив, а не массив объектов.

Благодаря

ответ

-1
function compareMyArrays(arrayOne, arrayTwo){ 
    var newArray = []; 
    var maxCounter = (arrayOne.lenght > arrayTwo.length) ? arrayOne.length : arrayTwo.length; 
    for(var i = 0; i < arrayOne.length; i++) { 
    var value1 = null; 
    if(arrayOne.length-1 <= i){ 
     value1 = arrayOne[i]; 
    } 
    var value2 = null; 
     if(arrayOne.length-1 <= i){ 
     value1 = arrayOne[i]; 
    } 
    if(!!value1 && !! value2){ 
     newArray[i] = {value1, value2} 
    } else if(!!value1) { 
     newArray[i] = {value1} 
    } else if(!!value2) { 
     newArray[i] = {value2} 
    } 
    } 
    return newArray; 
} 

возвращается именно то, что вы ищете, но работает только тогда, когда оба массива имеют одинаковую длину

Edit: теперь работает с массивами разной длины слишком

3
var merged = arrayTwo.map((o, i) => Object.assign({}, o, (arrayOne[i] || {}))); 
+0

вот почему я люблю StackOverflow. удивительное решение – owaishanif786

+2

вы можете даже пропустить '(arrayOne [i] || {})' Object.assign() может иметь дело с неопределенными значениями '(o, i) => Object.assign ({}, o, arrayOne [i ]) ' – Thomas

+3

Это работает, только если вы знаете, что arrayTwo длиннее arrayOne. –

2

что-то более общее:

function merge(...arrays){ 
    var length = arrays.reduce((len, arr) => Math.max(len, arr.length), 0); 
    var assign = i => (into, arr) => Object.assign(into, arr[i]); 
    return Array.from({ length }, (v,i) => arrays.reduce(assign(i), {})); 
} 

var arrayOne = [{id:1},{id:2}]; 
var arrayTwo = [{age: 20}, {age: 25}, {age: 22}]; 

merge(arrayOne, arrayTwo /*or as many as you want*/); 
1

ES6 подход:

const mergeArrays = (arr1, arr2) => { 
    if (arr2.length > arr1.length) [arr1,arr2] = [arr2, arr1] //swap: larger first 
    return arr1.map((item, idx) => Object.assign({}, item, arr2[idx])) 
} 

mergeArrays(
    [{id:1},{id:2}], [{age: 20}, 
    {age: 25}, {age: 22}] 
) 
//[ { age: 20, id: 1 }, { age: 25, id: 2 }, { age: 22 } ] 

mergeArrays(
    [{age: 20}, {age: 25}, {age: 22}], 
    [{id:1},{id:2}] 
) 
//[ { age: 20, id: 1 }, { age: 25, id: 2 }, { age: 22 } ] 

Обратите внимание, что длина может быть различной и порядок не имеет значения (вы можете передать больший массив до или после, результат тот же).

1
function zipObjects() { 
    return _.zip.apply(_, arguments).map(
     function(arr) { 
      return _.extend.apply(_, [{}].concat(arr)); 
     } 
    ); 
} 

или ES6:

function zipObjects(...args) { 
    return _.zip(...args).map(
     (arr) => _.extend({}, ...arr) 
    ); 
} 
+1

Пока это можно сделать красиво в ваниле, это единственный ответ с подчеркиванием, который помечен в вопросе. Приятно, что, хотя вы инкапсулировали его как функцию, вы можете просто запустить его в однострочном пространстве, если вам не нужно это делать. например 'const myZipped = _.zip (arrayOne, arrayTwo) .map ((arr) => _.extend ({}, ... arr));' –

0

Хорошего прецедент для генератора с объектом распространенного реквизитом:

function* zip(...args) { 
    const len = Math.max(...args.map(a => a.length)); 
    for (let i = 0; i < len; i++) { 
     yield Object.assign({}, ...args.map(a => a[i])); 
    } 
} 

Это позволит получить итератор, а не массив, так что вы можете получить результат массива с простым Array.from или с расширением массива, например

var arrayOne = [{id:1},{id:2}]; 
var arrayTwo = [{age: 20}, {age: 25}, {age: 22}]; 

console.log([...zip(arrayTwo, arrayOne)]); 

Редактирование: если вы не любите урожай, вы можете создать карту из нового массива, построенного на самую длинную длину. Работает с любым упорядочением массивов и любым количеством массивов объектов.

const zipAr = (...args) => Array 
.from({ length: Math.max(...args.map(a => a.length)) }) 
.map((_, i) => Object.assign({}, ...args.map(a => a[i]))); 
0

Object.assign() будет основным методом для присоединяемых объектов ..

Пример:

var arrayOne = [{id:1},{id:2}]; 
var arrayTwo = [{age: 20}, {age: 25}, {age: 22}]; 


//Lets assume that we want to update arrayTwo .. 

for(var i = 0 ; i < arrayOne.length; i++){ 
    arrayTwo[i] = Object.assign(arrayTwo[i] , arrayOne[i]) 
} 


console.log(arrayTwo); 

Надеется, что это помогает ..

0

Попробуйте это один код лайнера с использованием array.map() & Object.assign() метод .

DEMO

var arrayOne = [{id:1},{id:2}]; 
 
var arrayTwo = [{age: 20}, {age: 25}, {age: 22}]; 
 

 
var res = arrayTwo.map(function(item, index) { return Object.assign(item, arrayOne[index]); 
 
}); 
 

 
console.log(res);

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