Quantas vezes você precisou usar reduce para organizar arrays de objetos? No meu artigo anterior sobre Indexação de dados para aplicações front-end, explorei exatamente isso, mostrando como organizar estruturas complexas usando reduce e até Map.
Mas, convenhamos, reduce tende a deixar o código complexo e difícil de entender...
Quer uma boa notícia? Desde o lançamento do ECMAScript 2024 temos uma forma muito mais simples, expressiva e legível para fazer isso, utilizando os métodos Object.groupBy e Map.groupBy.
Sumário
Por que agrupar dados?
Agrupar dados é uma forma de indexação: você pega uma lista linear e reorganiza tudo usando uma chave. Esse tipo de organização melhora a performance, além de facilitar buscas e o consumo de dados em interfaces dinâmicas.
Antes dessas novas APIs, recorrer ao reduce era quase obrigatório. Funcionava, claro, mas exigia escrever mais código do que o necessário e a legibilidade acabava sofrendo:
// Como fazíamos antes
const produtos = [
{ nome: "iPhone", categoria: "eletrônicos", preco: 5000 },
{ nome: "Notebook", categoria: "eletrônicos", preco: 3000 },
{ nome: "Camiseta", categoria: "roupas", preco: 50 },
{ nome: "Calça", categoria: "roupas", preco: 120 },
];
const agrupados = produtos.reduce((acc, produto) => {
const categoria = produto.categoria;
if (!acc[categoria]) acc[categoria] = [];
acc[categoria].push(produto);
return acc;
}, {});
Object.groupBy
O Object.groupBy chega para resolver o agrupamento mais simples — aquele em que a chave é uma string. Você passa a lista e uma função que retorna a chave e pronto. O JavaScript devolve um objeto organizado, sem precisar criar inicializações manuais, verificações ou boilerplate.
const produtosPorCategoria = Object.groupBy(
produtos, // aqui a lista
(produto) => produto.categoria // e aqui a função
);
console.log(produtosPorCategoria);
console.log(produtosPorCategoria instanceof Object); // true
O resultado é direto, limpo e fácil de interpretar:
{
eletrônicos: [
{ nome: 'iPhone', categoria: 'eletrônicos', preco: 5000 },
{ nome: 'Notebook', categoria: 'eletrônicos', preco: 3000 }
],
roupas: [
{ nome: 'Camiseta', categoria: 'roupas', preco: 50 },
{ nome: 'Calça', categoria: 'roupas', preco: 120 }
]
}
Map.groupBy
Já Map.groupBy atende aos casos em que a chave não pode ser tratada como texto comum. Quando você precisa agrupar usando:
- datas,
- objetos,
- símbolos,
- ou qualquer valor que não deve virar string,
é ele que faz a diferença:
const vendas = [
{ valor: 100, data: new Date("2024-01-15") },
{ valor: 200, data: new Date("2024-01-15") },
{ valor: 150, data: new Date("2024-01-16") },
];
const vendasPorData = Map.groupBy(
vendas, // novamente, a lista
(venda) => venda.data.toDateString() // e a função
);
console.log(vendasPorData instanceof Map); // true
console.log(vendasPorData);
/*
{
'Sun Jan 14 2024': [
{valor: 100, data: 'Sun Jan 14 2024...'},
{valor: 200, data: 'Sun Jan 14 2024...'},
],
'Mon Jan 15 2024': [
{valor: 150, data: 'Mon Jan 15 2024...'}
]
}
*/
Acessar ou manipular os grupos fica mais explícito, o que ajuda bastante em projetos maiores:
const vendasDia15 = vendasPorData.get("Tue Jan 15 2024");
console.log(vendasDia15);
A principal vantagem é justamente essa: o Map mantém o tipo original da chave, o que evita conversões automáticas e ambiguidades — algo que pode gerar problemas silenciosos quando usamos objetos normais.
No fim das contas, Map.groupBy acaba sendo a alternativa mais flexível para quem lida com coleções diversas no JavaScript moderno.
Conclusão
Os novos métodos de agrupamento chegam para simplificar algo que sempre fez parte do nosso cotidiano de desenvolvimento. Em vez de escrever blocos repetitivos com reduce, agora podemos contar com soluções nativas, pensadas exatamente para esse propósito.
Quando combinados com as técnicas que apresentei no artigo anterior, eles deixam o fluxo de indexação mais claro, mais direto e muito mais expressivo.
Se você trabalha com listas, filtros, tabelas ou dashboards, vale experimentar essas APIs, provavelmente elas vão enxugar bastante o seu código.
⚠️ Nota sobre compatibilidade
Se você está se perguntando sobre suporte nos navegadores, boa notícia: segundo os dados do Can I Use, tanto
Object.groupByquantoMap.groupBysão amplamente suportados nos navegadores modernos.
A única exceção relevante é o Internet Explorer, que não oferece suporte a essas APIs — e não receberá.
Ou seja: se o seu público não usa IE, você pode adotar groupBy sem preocupações.

Top comments (0)