Лодаш, как назначить конкретное свойство объекта при сравнении двух коллекций разных объектов
У меня есть один вопрос. Есть ли какая-либо функция в библиотеке 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 достаточно богаты.