HOWTO · JavaScript

Classificar matriz de objeto por propriedade em JavaScript

Este tutorial demonstra como classificar um array de objetos por alguma propriedade.

Nesta página

Para ordenar um array de objetos por uma de suas propriedades, passe um comparador para sort(). O comparador lê essa propriedade em dois objetos e retorna um número negativo quando o primeiro deve vir antes, um número positivo quando deve vir depois ou zero quando as chaves são iguais. Use comparação de strings para chaves de texto e subtração para chaves numéricas.

Ordenar um array de objetos por uma propriedade de texto

Um comparador pode normalizar duas strings antes de compará-las. Assim, este exemplo ignora diferenças entre maiúsculas e minúsculas sem alterar os valores originais de lastName nos objetos.

Execute este exemplo:

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

const students = [
  { firstName: 'Rohan', lastName: 'Dalal', age: 19 },
  { firstName: 'Zain', lastName: 'Ahmed', age: 17 },
  { firstName: 'Anadi', lastName: 'Malhotra', age: 19 }
];

students.sort((a, b) => {
  const left = a.lastName.toLowerCase();
  const right = b.lastName.toLowerCase();
  if (left < right) return -1;
  if (left > right) return 1;
  return 0;
});

console.log(students.map(student => student.lastName).join(', '));
Ahmed, Dalal, Malhotra

O comparador retorna o sinal de ordenação necessário para sort(); não precisa retornar exatamente -1 ou 1, apenas um valor negativo, zero ou um valor positivo. Converter as strings para minúsculas é útil quando as maiúsculas não devem afetar a ordem. Isso não altera os nomes armazenados, pois toLowerCase() retorna uma nova string.

Ordenar strings com localeCompare()

Para propriedades de texto, localeCompare() oferece um comparador conciso e leva em conta regras de ordenação específicas de cada idioma. O método retorna um número negativo, zero ou um número positivo, por isso pode ser usado diretamente em sort():

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

const students = [
  { firstName: 'Rohan', lastName: 'Dalal', age: 19 },
  { firstName: 'Zain', lastName: 'Ahmed', age: 21 },
  { firstName: 'Anadi', lastName: 'Malhotra', age: 16 }
];

students.sort((a, b) => a.lastName.localeCompare(b.lastName));
console.log(students.map(student => student.lastName).join(', '));
Ahmed, Dalal, Malhotra

Escolha esta abordagem quando a chave for texto e uma comparação sensível ao idioma for adequada. localeCompare() compara strings; não é um método para ordenação numérica. Para escolher explicitamente um idioma ou opções como a diferenciação entre maiúsculas e minúsculas, passe a localidade e as opções aceitas pelo ambiente de execução para localeCompare().

Ordenar por uma propriedade numérica

Subtraia a chave numérica do segundo objeto da chave do primeiro. Se a primeira idade for menor, a.age - b.age será negativo, colocando a antes de b em ordem crescente.

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

const students = [
  { firstName: 'Rohan', lastName: 'Dalal', age: 19 },
  { firstName: 'Zain', lastName: 'Ahmed', age: 21 },
  { firstName: 'Anadi', lastName: 'Malhotra', age: 16 }
];

students.sort((a, b) => a.age - b.age);
console.log(students.map(student => student.age).join(', '));
16, 19, 21

Este padrão de subtração serve para valores numéricos. Não o use para nomes: subtrair strings não determina sua ordem alfabética. Da mesma forma, omitir o comparador não faz sort() examinar uma propriedade do objeto; a ordenação padrão compara as representações em string dos elementos do array. Por isso, em geral, objetos precisam de um comparador explícito.

Ordenar em ordem decrescente

Inverta os operandos do comparador para inverter a ordem. Para idades numéricas, b.age - a.age coloca as idades maiores primeiro. Assim, a regra de comparação continua vinculada à propriedade escolhida, sem ordenar em uma direção e depois inverter o array resultante.

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

const students = [
  { firstName: 'Rohan', lastName: 'Dalal', age: 19 },
  { firstName: 'Zain', lastName: 'Ahmed', age: 21 },
  { firstName: 'Anadi', lastName: 'Malhotra', age: 16 }
];

students.sort((a, b) => b.age - a.age);
console.log(students.map(student => student.age).join(', '));
21, 19, 16

Para ordenar strings em ordem decrescente, inverta o resultado do comparador de strings, por exemplo, negando a.lastName.localeCompare(b.lastName). Mantenha o comparador consistente para que chaves iguais continuem retornando zero.

Comportamento e limitações importantes de sort()

sort() altera o array original e retorna esse mesmo array. Se precisar preservar a ordem original, primeiro copie o array com const sortedStudents = [...students] e ordene a cópia. Os objetos em si não são clonados; a ordenação muda suas posições no array, não suas propriedades.

Sem um comparador, sort() converte os valores em strings e compara essas strings. Por isso, a ordenação padrão não é adequada para ordenar números nem para selecionar uma propriedade dos objetos. Forneça um comparador compatível com o tipo da chave. Estes exemplos pressupõem que cada objeto tenha a propriedade de texto ou numérica indicada. Eles não definem como tratar chaves ausentes ou tipos mistos; valide esses dados ou decida como tais valores devem ser comparados antes de aplicar o comparador.

Para consultar a API subjacente de arrays, veja a referência do método sort().