Скажем, у меня есть два массива, подобные следующим:
const arr1 = [
{id:1, value:25},
{id:2, value:15},
{id:3, value:35}
];
const arr2 = [
{id:3, value:95},
{id:4, value:65}
];
И мне нужен третий массив, включающий 3 элемента с уникальными идентификаторами, но для двух объектов с повторяющимися идентификаторами (id: 3) я хочу сохранить один и тот же идентификатор и добавить значения. В итоге что-то вроде...
const arr3 = [
{id:1, value:25},
{id:2, value:15},
{id:3, value:130},
{id:4, value:65},
];
Поэтому мне нужен наиболее эффективный способ найти объекты с одинаковыми идентификаторами, затем выполнить некоторую логику, чтобы объединить их значения и добавить объединенный объект обратно в новый объединенный массив.
const arr3 = Array.from([ ...arr1, ...arr2 ].reduce((idToSum, { id, value }) => idToSum.set(id, (idToSum.get(id) ?? 0) + value), new Map()), ([ id, value ]) => ({ id, value }));
.
@NinaScholz - я пытался сопоставить один из массивов и использовать .includes для поиска дубликатов, но сначала мне нужно сравнить свойство в объектах массива, а не сами объекты. А во-вторых, массивы могут быть разной длины.
Вы можете использовать простой объект js для отслеживания ids
, чтобы вы могли искать id
в O(1)
времени, независимо от того, используется он уже или нет.
id
в словаре или нет. если идентификатор отсутствует, мы вставляем новый ключ как id
и значение как {id, value}
. и если ключ присутствует, нам нужно добавить предыдущее значение с новым значением и, наконец, обновить его.const arr1 = [ {id:1, value:25}, {id:2, value:15}, {id:3, value:35} ];
const arr2 = [ {id:3, value:95}, {id:4, value:65} ];
const res = [...arr1, ...arr2].reduce((a, {id, value}) => ({...a, [id]: a[id] ? {id, value: a[id].value + value} : {id, value}}), {});
console.info(Object.values(res));
что пойдет не так?