Jose
Jose

Reputation: 1819

Create Map to reduce. Javascript

I have a result of "ImputacionData", and with a reduces it I group it with an attribute of the object:

this.imputacionesDatas = data;
this.imputacionesAndAusencias = this.imputacionesDatas.reduce(function (r, a) {
        r[a.empleadoId] = r[a.empleadoId] || [];
        r[a.empleadoId].push(a);
        return r;
    }, Object.create(null));

The problem that I do not know how to work with the result, would need to put it in a Map to be able to work with that data on the screen and be able to paint them.

I do not know how to put the result of the "reduce" in something like:

Map <number, Array <ImputacionData >>;

Upvotes: 4

Views: 17802

Answers (2)

Nina Scholz
Nina Scholz

Reputation: 386634

You could take Object.entries for getting keys and values in an array.

this.imputacionesAndAusencias = Object.entries(this.imputacionesDatas.reduce(function (r, a) {
    r[a.empleadoId] = r[a.empleadoId] || [];
    r[a.empleadoId].push(a);
    return r;
}, Object.create(null)));

If you like to get a Map, you could take the map as return value.

this.imputacionesAndAusencias = this.imputacionesDatas.reduce(function (map, object) {
    if (!map.has(object.empleadoId)) {
        return map.set(object.empleadoId, [object]);
    }
    map.get(object.empleadoId).push(object);
    return map;
}, new Map);

Upvotes: 8

CertainPerformance
CertainPerformance

Reputation: 370789

You can set the accumulator's initial value to new Map() and then use the Map methods to set its values.

const input = [{
  empleadoId: 5
}, {
  empleadoId: 5
}, {
  empleadoId: 6
}];
const output = input.reduce((map, item) => {
  const { empleadoId } = item;
  if (map.has(empleadoId)) map.get(empleadoId).push(item);
  else map.set(empleadoId, [item]);
  return map;
}, new Map());
console.log(...output);

Upvotes: 0

Related Questions