'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