Ordenar um array de objetos em JavaScript (gerador de comparador) | We.Inc
Monte um comparador com cliques: ordene objetos por número, texto, data ou duas chaves, com opções de localeCompare, e veja o resultado e o código lado a lado.
Ordenar um array de objetos em JavaScript
Passe para o sort uma função de comparação que olhe a propriedade que importa. Para números, retorne a.price - b.price. Para texto, retorne a.name.localeCompare(b.name). Para datas, subtraia os timestamps. Um resultado negativo coloca a primeiro, um positivo coloca b primeiro. Use toSorted em vez de sort quando a ordem original precisar ser preservada.
(a, b) => Date.parse(a.joined) - Date.parse(b.joined)
troque a e b
Boolean (true primeiro)
(a, b) => Number(b.active) - Number(a.active)
troque a e b
Ordenar objetos confunde as pessoas por três motivos: o sort padrão compara tudo como texto, letras maiúsculas vêm antes das minúsculas em uma comparação simples com menor que, e o sort reescreve o array que você passa para ele. O gerador abaixo permite mudar cada uma dessas opções em uma pequena lista de equipe e ver a ordem mudar, com o comparador correspondente pronto para copiar.
Escolha a propriedade para ordenar: nome, idade, data de início ou um código de ticket que mistura letras e dígitos.
Escolha crescente ou decrescente e, para chaves de texto, escolha a comparação simples ou o localeCompare com a opção numeric.
Adicione uma segunda chave para desempatar, por exemplo primeiro a equipe, depois o nome.
Copie o código gerado. A tabela mostra a ordem que o seu comparador produz neste momento.
Nunca chame sort() sem função em números ou objetos. Sem comparador, cada valor vira string, então 10 fica antes de 9 e todos os objetos viram [object Object].
Retorne um número, não true ou false. Um resultado booleano é convertido em 1 ou 0 e gera uma ordem pouco confiável.
Vai ordenar uma lista longa com localeCompare? Crie um único Intl.Collator e passe o método compare dele; o MDN observa que isso é mais rápido para arrays grandes.
Coloque de propósito os registros sem valor no final, por exemplo testando null antes de subtrair, para que eles não se espalhem pela lista.
Perguntas frequentes
Como ordeno um array de objetos por uma propriedade?
Chame people.sort((a, b) => a.age - b.age) para uma propriedade numérica ou people.sort((a, b) => a.name.localeCompare(b.name)) para uma string. Troque a e b para inverter a direção.
Como ordeno por dois campos?
Compare o primeiro campo e só passe para o segundo quando o primeiro empatar: (a, b) => a.team.localeCompare(b.team) || a.age - b.age. O || funciona porque um empate retorna 0, que conta como false.
O sort do JavaScript é estável?
Sim. Desde o ECMAScript 2019 o sort precisa ser estável, então itens considerados iguais mantêm a ordem anterior. É por isso que ordenar primeiro por nome e depois por equipe gera uma lista agrupada por equipe, com os nomes em ordem dentro de cada grupo.
O sort altera o array original?
Sim. O sort reordena o array no lugar e retorna esse mesmo array. O toSorted aceita a mesma função de comparação, mas retorna um array novo e não mexe na ordem original. Ele está disponível nos principais navegadores desde julho de 2023.
Por que nomes em minúsculas ficam depois dos em maiúsculas?
Uma comparação simples com < ou > compara códigos de caracteres, e toda letra maiúscula tem código menor que qualquer minúscula. O localeCompare segue o alfabeto do idioma e, com { sensitivity: 'base' }, também trata acentos e maiúsculas como iguais.
O que a função de comparação realmente retorna
O sort só olha o sinal do número que você retorna. Abaixo de zero significa que a vem antes de b, acima de zero significa que b vem primeiro, e zero significa deixar como estão. O tamanho do número não importa, e é por isso que a subtração funciona para números e datas.
A subtração não funciona para texto, já que 'b' - 'a' é NaN. O localeCompare retorna um número negativo, zero ou positivo para strings, então ele se encaixa direto no mesmo padrão.
Datas, valores ausentes e tipos misturados
Objetos Date subtraídos viram um número de milissegundos, então a.joined - b.joined ordena do mais antigo para o mais novo. Datas guardadas como texto no formato ISO (2026-10-14) também ordenam corretamente com localeCompare, porque o ano vem primeiro, mas outros formatos como 14/10/2026 não.
Elementos undefined sempre vão para o final e nunca são passados para a sua função. Uma propriedade undefined em um objeto é diferente: o objeto ainda chega ao seu comparador, então verifique isso você mesmo.
Por que o sort() simples erra com números
Sem uma função de comparação, cada elemento é convertido em string e comparado por unidades de código UTF-16, então o primeiro caractere decide.
Ordem padrão versus um comparador numérico
O padrão coloca 100 antes de 25 porque o texto '1' vem antes de '2'.
Ordenação por várias chaves, sensível ao idioma e sem mutação
Equipe de A a Z, depois o mais velho primeiro, sem mexer no original
A cadeia de || só passa para a próxima chave quando a comparação anterior é 0. O toSorted retorna um array novo.
Um único Intl.Collator para uma lista longa
numeric: true coloca T-2 antes de T-10, e sensitivity: 'base' ignora maiúsculas e acentos.
Um helper sortBy reutilizável
Passe os nomes das chaves em ordem. Um sinal de menos antes de uma chave ordena essa chave de forma decrescente.
Gerador de comparador
Escolha como ordenar a lista de equipe de exemplo e a tabela e o código se atualizam juntos.
Ordenar por
Depois por (desempate)
Nada
Direção
Crescente
Decrescente
Comparação de texto
Simples com < e >
localeCompare
localeCompare, numérico e sem diferenciar maiúsculas
Lista de exemplo usada pelo gerador de comparador (ordem original)