Объединить 2 JS массива объектов по значению - PullRequest
1 голос
/ 13 апреля 2019

Задача

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

Я хочу добавить пары ключ: значение из массива 2 к правильному объекту в массиве 1 на основе соответствующего уникального значения.Значения для array1.user и array2._id - это те значения, которым мне нужно соответствовать.

Массивы

const array1 = [ { _id: 5c6c7132f9bf4bdab9c906ff,
    user: 5c65d9438e4a834c8e85dd7d },
  { _id: 5c6ccd6d3a0dc4e4951c2bee,
    user: 5c65d9438e4a834c8e85dd7e } ]

const array2 = users [ { _id: 5c65d9438e4a834c8e85dd7d,
    info: { name: 'John', city: 'New York' } },
  { _id: 5c65d9438e4a834c8e85dd7e,
    info: { name: 'Paneer', city: 'San Fran' } } ]

Что я пробовал

Я пытался использовать функции lodash _.map и _.extend примерно так, но я новичок в lodash, и он не дает мнеправильный вывод

  const mergedArray = _.map(array1, function(item){
    return _.extend(item, _.find(array2, {_id: item.user}));
  });

Результат

mergedArray [ { _id: 5c65d9438e4a834c8e85dd7d,
    info: { name: 'John', city: 'New York' } },
  { _id: 5c65d9438e4a834c8e85dd7e,
    info: { name: 'Paneer', city: 'San Fran' } }]

Желаемый результат

const mergedArray = [ { _id: 5c6c7132f9bf4bdab9c906ff,
    user: 5c65d9438e4a834c8e85dd7d,
    info: { name: 'John', city: 'New York' } } ,
  { _id: 5c6ccd6d3a0dc4e4951c2bee,
    user: 5c65d9438e4a834c8e85dd7e, 
    info: { name: 'Paneer', city: 'San Fran' } } ]

Ответы [ 3 ]

1 голос
/ 13 апреля 2019

Вы можете взять Map и построить новый объект для результата.

const
    array1 = [{ _id: '5c6c7132f9bf4bdab9c906ff', user: '5c65d9438e4a834c8e85dd7d' }, { _id: '5c6ccd6d3a0dc4e4951c2bee', user: '5c65d9438e4a834c8e85dd7e' }],
    array2 = [{ _id: '5c65d9438e4a834c8e85dd7d', info: { name: 'John', city: 'New York' } }, { _id: '5c65d9438e4a834c8e85dd7e', info: { name: 'Paneer', city: 'San Fran' } }],
    users = new Map(array2.map(({ _id, info }) => [_id, { info }])),
    merged = array1.map(o => ({ ...o, ...(users.get(o.user) || {}) }));

console.log(merged);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 13 апреля 2019

Вы можете использовать карту и найти

В случае, если ваше отображение массивов в той же последовательности, что вы можете избежать использования find

const array1 = [ { _id: `5c6c7132f9bf4bdab9c906ff`,user: `5c65d9438e4a834c8e85dd7d` },{ _id: `5c6ccd6d3a0dc4e4951c2bee`,user: `5c65d9438e4a834c8e85dd7e` }]
const array2 =[ { _id: `5c65d9438e4a834c8e85dd7d`,info: { name: 'John', city: 'New York' } },{ _id: `5c65d9438e4a834c8e85dd7e`,info: { name: 'Paneer', city: 'San Fran' } } ]
    
const final = array1.map(e=> {
  const found = array2.find(({_id}) => e.user === _id)
  return {
    ...e,
    info : found.info
  }
})

console.log(final)
0 голосов
/ 13 апреля 2019

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

const array1 = [ { _id: "5c6c7132f9bf4bdab9c906ff",user: "5c65d9438e4a834c8e85dd7d" },{ _id: "5c6ccd6d3a0dc4e4951c2bee",user: "5c65d9438e4a834c8e85dd7e" } ];
const ids = array1.reduce((a, {user, _id}) => ({...a, [user]: _id}), {});
const array2 = [ { _id: "5c65d9438e4a834c8e85dd7d",info: { name:'John', city: 'New York' } },{ _id: "5c65d9438e4a834c8e85dd7e", info: { name: 'Paneer', city: 'San Fran' } } ];
    
array2.forEach(o => {
  o.user = o._id;
  o._id = ids[o._id];
});

console.log(array2);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...