Давайте посмотрим на пример.
let arr1 = [{image: "some_image_url_1.png"}, {image: "some_image_url_2.png"}]
let arr2 = [{value: "some value 1"}, {value: "some value 2"}]
Мне нужно объединить эти 2 массива объектов и создать следующий массив.
let result = [{image: "some_image_url_1.png", value: "some value 1"},
{image: "some_image_url_2.png", value: "some value 2"}]
Есть ли какое-нибудь решение сделать это с angular 2? Может с lodash?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если вам нравится изменять фактические объекты в arr1, вы можете сделать что-нибудь простое, например:
arr1.forEach((item, i) => item.value = arr2[i].value)
Если вы не хотите изменять исходные массивы, вы можете использовать Object.assign для создания нового объекта:
arr1.map((item, i) => Object.assign({}, item, arr2[i]))
Что, если объект во втором массиве имеет другие свойства, отличные от value, или несколько свойств?
Используйте функцию карты javascript.
var arr1 = [1, 2, 3]
var arr2 = ['a', 'b', 'c']
var result = arr1.map(function(e, i) {
return [e, arr2[i]];
});
См. карта
Используйте Object.assign для достижения этого, когда вам не нужно зависеть от имени ключа для объекта, которым в вашем случае является value. Вы можете использовать код с большей гибкостью для имени свойств:
let arr1 = [{image: "some_image_url_1.png"}, {image: "some_image_url_2.png"}]
let arr2 = [{value: "some value 1"}, {value: "some value 2"}]
let res = [];
arr1.forEach(function(obj, index){
let newObj = Object.assign(obj, arr2[index])
res.push(newObj);
});
console.info(res);Основное преимущество использования Object.assign заключается в том, что он позволяет объединить объект с несколькими свойствами, например:
let arr1 = [{image: "some_image_url_1.png"}, {image: "some_image_url_2.png"}]
let arr2 = [{value: "some value 1", anotherValue: 'anotherValue1'}, {value: "some value 2", anotherValue: 'anotherValue2'}]
let res = [];
arr1.forEach(function(obj, index){
let newObj = Object.assign(obj, arr2[index])
res.push(newObj);
});
console.info(res);Чтобы сгенерировать новый массив из существующих массивов, вы можете использовать map():
let arr1 = [{image: "some_image_url_1.png"}, {image: "some_image_url_2.png"}]
let arr2 = [{value: "some value 1"}, {value: "some value 2"}]
let result = arr1.map(function(i, idx){
var obj = {};
obj.image = i.image;
obj.value = arr2[idx].value;
return obj;
});
console.info(result)[{image: "some_image_url_1.png", value: "some value 1"},
{image: "some_image_url_2.png", value: "some value 2"}]Что, если объект во втором массиве имеет другие свойства, отличные от value, или несколько свойств?
Это наверное самое чистое решение имхо. Кстати: также более подробно, чем мой ответ, лол
Для произвольного количества массивов и неравной длины вы можете уменьшить массив и Object.assign для объектов.
var array1 = [{image: "some_image_url_1.png"}, {image: "some_image_url_2.png"}],
array2 = [{value: "some value 1"}, {value: "some value 2"}],
result = [array1, array2].reduce(
(r, a) => (a.forEach((o, i) => Object.assign(r[i] = r[i] || {}, o)), r),
[]
);
console.info(result);есть некоторая странность, где он сочетает в себе реквизиты, помимо меня: playcode.io/627249
@LawrenceCherone, какой результат вы ожидаете?
извините, dint хотел украсть ваш ответ (было лучшим, что я нашел). см. перо снова добавил комментарий
@LawrenceCherone, вам нужно что-то другое, потому что вам не нужно слияние по одному и тому же индексу, вместо этого вам нужно (предположительно) слияние по ключу. раздражает последний пустой объект. что должно произойти, если у вас более одного объекта недвижимости? (просто чтобы упомянуть ... может быть, новый вопрос будет лучше ...)
Angular использует машинописный текст и нотацию стрелок. Вам нужна всего одна строка:
let result = arr1.map((item, index) => ({...item, ...arr2[index]}));
Вы можете объединить два массива, не удаляя дубликаты:
ES6 с деструктуризацией
const arr1 = [{image: "some_image_url_1.png"}, {image: "some_image_url_2.png"}];
const arr2 = [{value: "some value 1"}, {value: "some value 2"}]
const arr3 = [...arr1, ...arr2];
ES5 с использованием concat
const arr1 = [{image: "some_image_url_1.png"}, {image: "some_image_url_2.png"}];
const arr2 = [{value: "some value 1"}, {value: "some value 2"}];
arr2.concat(arr1);
Это должно быть работоспособным, например:
let arr1 = [{image: "some_image_url_1.png"}, {image: "some_image_url_2.png"}]
let arr2 = [{value: "some value 1"}, {value: "some value 2"}]
let merged = arr1.concat(arr2);
Вы не должны включать благодарность за ответы в самом вопросе. Вы можете сделать это здесь, в комментариях.