В этом решении предполагается, что будет только два набора, а свойство id
уникально в каждом наборе.
Вы можете создать пересечение из двух наборов объединенных объектов на основедля общего свойства (id
) с помощью:
- Выполните итерацию первого набора, а затем найдите второй набор для текущего элемента первого набора.
- Если совпадение найдено, объедините два объекта в новый объект, затем добавьте этот объект в набор аккумуляторов.
- Возвращает аккумулятор
Этот метод возвращает новый набор, содержащий объединенные объекты, найденные в обоих наборах.Если объект отсутствует в любом наборе, он не будет включен в вывод.
const inputOne = [ {id: "valueA", prop: 123}, {id: "valueB", prop: 456}, {id: "valueD", prop: 789} ]
const inputTwo = [ {id: "valueA", other: 54}, {id: "valueB", other: 98}, {id: "valueC", other: 11} ]
function intersectAndMerge(a, b) {
const accumulator = []
for(let { id, ...props } of a) {
const match = b.find(e => e.id === id)
if(match !== undefined) {
accumulator.push({ ...match, ...props })
}
}
return accumulator
}
console.log(intersectAndMerge(inputOne, inputTwo))
Это также можно сделать с помощью цикла сокращения, но я считаю его менее читабельным:
const inputOne = [ {id: "valueA", prop: 123}, {id: "valueB", prop: 456}, {id: "valueD", prop: 789} ]
const inputTwo = [ {id: "valueA", other: 54}, {id: "valueB", other: 98}, {id: "valueC", other: 11} ]
function intersectAndMerge(a, b) {
return a.reduce((accumulator, { id, ...props }) => {
const match = b.find(e => e.id === id)
if(match !== undefined) {
accumulator.push({ ...match, ...props })
}
return accumulator
}, [])
}
console.log(intersectAndMerge(inputOne, inputTwo))