Como Ordenar Arrays de Objetos por Múltiplos Critérios em JavaScript
Ao manipular dados no front-end ou Node.js, é comum precisar ordenar listas complexas, como organizar eventos por data e desempatar pelo nome. Combinar o método nativo .sort() com String.prototype.localeCompare() garante uma ordenação performática, precisa e resiliente a caracteres especiais e acentuação.
JavaScript
// Exemplo prático: Lista de registros a serem ordenados
const eventos = [
{ data: '2026-10-25', nome: 'Workshop de Redes' },
{ data: '2026-10-20', nome: 'Palestra sobre Cloud' },
{ data: '2026-10-25', nome: 'Bootcamp de Segurança' },
{ data: '2026-10-20', nome: 'Curso de Linux' }
];
// Ordenação encadeada: Primeiro por 'data' (crescente), depois por 'nome' (alfabética)
eventos.sort((a, b) => {
// Critério 1: Comparação de datas (ordem alfabética/ISO YYYY-MM-DD funciona diretamente)
const comparacaoData = a.data.localeCompare(b.data);
// Se as datas forem diferentes, retorna o resultado da data
if (comparacaoData !== 0) {
return comparacaoData;
}
// Critério 2: Desempate pelo nome
return a.nome.localeCompare(b.nome, 'pt-BR', { sensitivity: 'base' });
});
console.log(eventos);
/*
Saída esperada:
[
{ data: '2026-10-20', nome: 'Curso de Linux' },
{ data: '2026-10-20', nome: 'Palestra sobre Cloud' },
{ data: '2026-10-25', nome: 'Bootcamp de Segurança' },
{ data: '2026-10-25', nome: 'Workshop de Redes' }
]
*/
- Operador de desempate: O retorno de
.localeCompare()é-1,0ou1. Se o primeiro critério for diferente de0, ele é aplicado imediatamente; se for0, a execução passa para o segundo critério. - Resolução de acentuação: O método
localeCompare('pt-BR', { sensitivity: 'base' })ignora diferenças entre maiúsculas/minúsculas e acentos, garantindo a ordem alfabética correta do português. - Mutação in-place: O método
.sort()altera o array original diretamente. Se precisar preservar a lista original, utilize[...eventos].sort(...)ou o método modernoeventos.toSorted(...). - Formato de datas ISO: A comparação direta de strings de data via
localeComparesó funciona perfeitamente se o formato estiver padronizado comoYYYY-MM-DD. Caso utilize objetosDate, subtraia os timestamps (a.data - b.data).
