Лодаш, как назначить конкретное свойство объекта при сравнении двух коллекций разных объектов

У меня есть один вопрос. Есть ли какая-либо функция в библиотеке lodash, которая предоставит мне метод для сравнения каждого объекта в обеих коллекциях по определенному свойству, и если условие выполняется, то создание другого объекта?

example:

    a) [{a:1,b:'abc',c:'dfr'},{a:3,b:'dfe',c:'gty'}....{}]
    b) [{a:3,b:'fgt',d:'ghr'},{a:5,b:'ghk',d:'bhj'}...{}]

 result:[{a:3,b:'dfe',c:'gty',d:'ghr'}]

Я хотел бы сравнить эти две коллекции по параметру "a" и, если параметр соответствует, назначить параметр "d" для объекта из коллекции a). Я прочитал кое-что о разнице или пересечении, но я не уверен, может ли это работать, или, может быть, есть более эффективные функции для этого. Заранее спасибо!

2 ответа

Создать карту предметов в array2 по их ключам. повторять array1 с Array.filter() и удалите все элементы, которые их a недвижимость не найдена на карте. использование Array.map() объединить оставшиеся предметы с d собственность их коллеги на карте:

const array1 = [{a:1,b:'abc',c:'dfr'},{a:3,b:'dfe',c:'gty'}];
const array2 = [{a:3,b:'fgt',d:'ghr'},{a:5,b:'ghk',d:'bhj'}];

// create a Map of array2 items by the a property
const array2Map = new Map(array2.map((o) => [o.a, o]));
const result = array1
  // filter out all items that don't have matching item in the Map
  .filter(o => array2Map.has(o.a))
  // map the items, and add the d property from the item in the Map
  .map(o => ({
    ...o,
    d: array2Map.get(o.a).d
  }));

console.log(result);

1) Родной путь: создание карты массива и сравнение внутри цикла карты с назначением объектов.

const array1 = [{a:1,b:'abc',c:'dfr'},{a:3,b:'dfe',c:'gty'}];
const array2 = [{a:3,b:'fgt',d:'ghr'},{a:5,b:'ghk',d:'bhj'}];

const result = array1.map(obj1 => {
  const obj2 = array2.find(obj => obj.a === obj1.a);
  if (obj2) return Object.assign({}, obj1, {d: obj2.d});
}).filter(value => value);

console.log(result);

2) Способ Лодаша: такой же, как в примере 1, но с использованием только методов Лодаша

const array1 = [{a:1,b:'abc',c:'dfr'},{a:3,b:'dfe',c:'gty'}];
const array2 = [{a:3,b:'fgt',d:'ghr'},{a:5,b:'ghk',d:'bhj'}];

const result = _.compact(
  _.map(array1, obj1 => {
    const obj2 = _.find(array2, _.matchesProperty('a', obj1.a));
    if (obj2) return _.assign({}, obj1, _.pick(obj2, ['d']));
  })
);

console.log(result);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.10/lodash.min.js"></script>


PS Старайтесь избегать lodash, подчеркивания и так далее, насколько это возможно. JS, ES достаточно богаты.

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