Объединить объекты двух массивов

Давайте посмотрим на пример.

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?

Вы не должны включать благодарность за ответы в самом вопросе. Вы можете сделать это здесь, в комментариях.

Mamun 05.05.2018 11:18
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
80
8

Ответы 8

Если вам нравится изменять фактические объекты в arr1, вы можете сделать что-нибудь простое, например:

arr1.forEach((item, i) => item.value = arr2[i].value)

Если вы не хотите изменять исходные массивы, вы можете использовать Object.assign для создания нового объекта:

arr1.map((item, i) => Object.assign({}, item, arr2[i]))

Что, если объект во втором массиве имеет другие свойства, отличные от value, или несколько свойств?

Ankit Agarwal 05.05.2018 09:57

Используйте функцию карты 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, или несколько свойств?

Ankit Agarwal 05.05.2018 09:57

Это наверное самое чистое решение имхо. Кстати: также более подробно, чем мой ответ, лол

jdickel 05.05.2018 09:57

Для произвольного количества массивов и неравной длины вы можете уменьшить массив и 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

Lawrence Cherone 26.06.2020 20:07

@LawrenceCherone, какой результат вы ожидаете?

Nina Scholz 26.06.2020 20:11

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

Lawrence Cherone 26.06.2020 20:17

@LawrenceCherone, вам нужно что-то другое, потому что вам не нужно слияние по одному и тому же индексу, вместо этого вам нужно (предположительно) слияние по ключу. раздражает последний пустой объект. что должно произойти, если у вас более одного объекта недвижимости? (просто чтобы упомянуть ... может быть, новый вопрос будет лучше ...)

Nina Scholz 26.06.2020 20:23

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);

Другие вопросы по теме