Venkat
Venkat

Reputation: 115

JS reducer to return object

I want to get the output like '{ sitting: 3, standing: 2 }' from the below code, can one can help ?

 var desks = [
  { type: 'sitting' },
  { type: 'standing' },
  { type: 'sitting' },
  { type: 'sitting' },
  { type: 'standing' }
];

var deskTypes = desks.reduce(function() {
    //Acutal code.
}, { sitting: 0, standing: 0 });

Upvotes: 0

Views: 253

Answers (4)

Walid Dkhili
Walid Dkhili

Reputation: 16

const desks = [
  { type: "sitting" },
  { type: "standing" },
  { type: "sitting" },
  { type: "sitting" },
  { type: "standing" },
];

const deskTypes = desks.reduce(
  (acc, item) => {
    
    if (item.type === "sitting") {
      acc.sitting++;
    } else {
      acc.standing++;
    }

    return acc;
  },
  { sitting: 0, standing: 0 }
);

console.log(deskTypes);

Upvotes: 0

Angel Zlatanov
Angel Zlatanov

Reputation: 328

let deskTypes = desks.reduce(
  (types, { type }) => {
    types[type]++;
    return types;
  },
  { sitting: 0, standing: 0 }
);

Upvotes: 0

Derek Wang
Derek Wang

Reputation: 10193

It's simply done using Array.reduce.

const desks = [
  { type: 'sitting' },
  { type: 'standing' },
  { type: 'sitting' },
  { type: 'sitting' },
  { type: 'standing' }
];

const result = desks.reduce((acc, cur) => {
  if (acc[cur.type]) {
    acc[cur.type] ++;
  } else {
    acc[cur.type] = 1;
  }
  return acc;
}, {});
console.log(result);

Upvotes: 1

Lionel Rowe
Lionel Rowe

Reputation: 5926

You can do it like this. Make sure to return the types accumulator object after each iteration.

const desks = [
    { type: 'sitting' },
    { type: 'standing' },
    { type: 'sitting' },
    { type: 'sitting' },
    { type: 'standing' },
]

const deskTypes = desks.reduce((types, desk) => {
    types[desk.type]++
    
    return types
}, { sitting: 0, standing: 0 })

console.log(deskTypes)

Upvotes: 2

Related Questions