Home > Mobile >  Group array of objects by category
Group array of objects by category

Time:01-20

How can I group this array of objects by categoria?

items = [
  { categoria: 'Sandwiches', nombre: 'Sandwich de Pollo',  precio: 12 },
  { categoria: 'Sandwiches', nombre: 'Sandwich de Lomo',  precio: 12 },
  { categoria: 'Helados', nombre: 'Helado de 1 bola', precio: 5 },
  { categoria: 'Helados', nombre: 'Helado de 2 bolas', precio: 8 },
  { categoria: 'Helados', nombre: 'Helado de 3 bolas', precio: 10 },
];

I want to get is something like this, I'm working on Typescript with Angular:

itemsResult = [
{
  categoria: 'Sandwiches',
  items: [
    { nombre: 'Sandwich de Pollo',  precio: 12 },
    { nombre: 'Sandwich de Lomo',  precio: 12 },
  ]
},
{
  categoria: 'Helados',
  items: [
    { nombre: 'Helado de 1 bola', precio: 5 },
    { nombre: 'Helado de 2 bolas', precio: 8 },
    { nombre: 'Helado de 3 bolas', precio: 10 },
  ]
 },
];

I have tried with a reduce but what I get is an object, I want an array

this.itemsGroup = this.items.reduce((r, a) => {
      r[a.categoria] = r[a.categoria] || [];
      r[a.categoria].push(a);
      return r;
    }, Object.create(null));
    console.log(this.itemsGroup);

{
  Sandwiches: [
   { nombre: 'Sandwich de Pollo',  precio: 12 },
   { nombre: 'Sandwich de Pollo',  precio: 15 }
  ],
  Helados: [
   { nombre: 'Helado de 1 bola', precio: 5 },
   { nombre: 'Helado de 2 bolas', precio: 8 },
   { nombre: 'Helado de 3 bolas', precio: 10 }
  ]
}

CodePudding user response:

You can do it using _.groupBy()

const items = [
  { categoria: 'Sandwiches', nombre: 'Sandwich de Pollo', precio: 12 },
  { categoria: 'Sandwiches', nombre: 'Sandwich de Lomo', precio: 12 },
  { categoria: 'Helados', nombre: 'Helado de 1 bola', precio: 5 },
  { categoria: 'Helados', nombre: 'Helado de 2 bolas', precio: 8 },
  { categoria: 'Helados', nombre: 'Helado de 3 bolas', precio: 10 },
];

let newArr = [];
let grp = _.groupBy(items, "categoria");

for (const obj in grp) {
  newArr.push({ categoria: obj, items: grp[obj] });
}

console.log(newArr, 'newArr');

If you don't want to underscore.js you can do it using reduce() !

const items = [
  { categoria: 'Sandwiches', nombre: 'Sandwich de Pollo', precio: 12 },
  { categoria: 'Sandwiches', nombre: 'Sandwich de Lomo', precio: 12 },
  { categoria: 'Helados', nombre: 'Helado de 1 bola', precio: 5 },
  { categoria: 'Helados', nombre: 'Helado de 2 bolas', precio: 8 },
  { categoria: 'Helados', nombre: 'Helado de 3 bolas', precio: 10 },
];
let newArr = [];

let grp = items.reduce((group, product) => {
  const { categoria } = product;
  group[categoria] = group[categoria] ?? [];
  group[categoria].push(product);
  return group;
}, {});

for (const obj in grp) {
  newArr.push({ categoria: obj, items: grp[obj] });
}

console.log(newArr, 'newArr');

CodePudding user response:

My solution:

const items = [
  { categoria: "Sandwiches", nombre: "Sandwich de Pollo", precio: 12 },
  { categoria: "Sandwiches", nombre: "Sandwich de Lomo", precio: 12 },
  { categoria: "Helados", nombre: "Helado de 1 bola", precio: 5 },
  { categoria: "Helados", nombre: "Helado de 2 bolas", precio: 8 },
  { categoria: "Helados", nombre: "Helado de 3 bolas", precio: 10 }
];

const groupedArr = items.reduce((prev, { categoria, ...items }) => {
  const id = prev.findIndex((item) => item.categoria === categoria);
  id >= 0 
    ? prev[id].items.push(items)
    : prev.push({categoria, items: [items]})
  return prev
}, []);

console.log(groupedArr);

I think it is more clearable and shorted than @Mayur Vaghasiya solution

  •  Tags:  
  • Related