'eliminate a variable for an accumulation operation
The following code produces the desired result but is there a way to refactor it to eliminate the accumulator
variable?
const data = [
{ id: "428", date: "2017-01-24" },
{ id: "526", date: "2022-01-01" },
{ id: "428", name: "George" },
{ id: "526", name: "Sam" },
{ id: "827", name: "Dan" }
];
const accumulator = {};
data.forEach(o => {
accumulator[o.id] = { ...accumulator[o.id] , ...o } || o;
});
console.log(accumulator);
Solution 1:[1]
The built-in method reduce
already does this. Pass the accumulator as the second argument. The first argument in the callback is the accumulated value. The second is the current object in this iteration. Return value of callback is passed to next iteration as the accumulated value.
const data = [
{ id: "428", date: "2017-01-24" },
{ id: "526", date: "2022-01-01" },
{ id: "428", name: "George" },
{ id: "526", name: "Sam" },
{ id: "827", name: "Dan" },
];
const result = data.reduce((accumulator, o) => {
accumulator[o.id] = { ...accumulator[o.id] , ...o } || o;
return accumulator;
}, {});
console.log(result);
Solution 2:[2]
You can reduce the dataset using Array.prototype.reduce
. Just find the previous object by the id
key in the accumulator (acc
) or use a new object, and spread the current object over it.
const data = [
{ id: "428", date: "2017-01-24" },
{ id: "526", date: "2022-01-01" },
{ id: "428", name: "George" },
{ id: "526", name: "Sam" },
{ id: "827", name: "Dan" }
];
const reduceBy = (data, predicate) =>
data.reduce((acc, obj) =>
(key => ({
...acc,
[key]: {
...(acc[key] ?? {}),
...obj
}
}))
(typeof predicate === 'string'
? obj[predicate]
: predicate(obj)
), {});
const reducedData = reduceBy(data, ({ id }) => id); // or reduceBy(data, 'id')
console.log(reducedData);
.as-console-wrapper { top: 0; max-height: 100% !important; }
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | hittingonme |
Solution 2 |