Classificar matriz de objeto por propriedade em JavaScript

Aryan Tyagi 12 outubro 2023
Classificar matriz de objeto por propriedade em JavaScript

Este artigo irá discutir como classificar um array de objetos com base nos valores das propriedades do objeto.

Em JavaScript, usamos a função sort() para classificar um array de objetos. A função sort() é usada para classificar os elementos de um array em ordem alfabética e não numérica. Para obter os itens na ordem inversa, podemos usar o método reverse().

No entanto, a função tradicional sort() pode ficar para trás às vezes para comparar um array de objetos com base em alguma propriedade. Portanto, podemos criar uma função de comparação definida pelo usuário para ser usada com a função sort(). Este método compara as propriedades dos itens em um array.

O exemplo abaixo mostra como escrever sua própria função de comparação.

let students = [
  {fname: 'Rohan', lname: 'Dalal', age: 19},

  {fname: 'Zain', lname: 'Ahmed', age: 17},

  {fname: 'Anadi', lname: 'Malhotra', age: 19}
];


function compare_lname(a, b) {
  if (a.lname.toLowerCase() < b.lname.toLowerCase()) {
    return -1;
  }
  if (a.lname.toLowerCase() > b.lname.toLowerCase()) {
    return 1;
  }
  return 0;
}

students.sort(compare_lname);
console.log(students)

Produção:

[
  { fname: 'Zain', lname: 'Ahmed', age: 17 },
  { fname: 'Rohan', lname: 'Dalal', age: 19 },
  { fname: 'Anadi', lname: 'Malhotra', age: 19 }
]

No exemplo acima, primeiro converta o lname em minúsculas e depois comparamos os nomes dependendo da comparação da string. Ele retorna a matriz classificada de objetos com base no lname do objeto. Por ordem decrescente, podemos substituir a função sort() por reverse().

Se estivermos lidando com strings, podemos eliminar a necessidade de criar uma função de comparação e simplesmente usar a função localeCompare() com a função sort() para obter o resultado desejado.

Veja o código abaixo.

let students = [
  {fname: 'Rohan', lname: 'Dalal', age: 19},

  {fname: 'Zain', lname: 'Ahmed', age: 21},

  {fname: 'Anadi', lname: 'Malhotra', age: 16}
];


students.sort((a, b) => a.lname.localeCompare(b.lname));
console.log(students);

Produção:

[
  { fname: 'Zain', lname: 'Ahmed', age: 21 },
  { fname: 'Rohan', lname: 'Dalal', age: 19 },
  { fname: 'Anadi', lname: 'Malhotra', age: 16 }
]

O localeCompare() funciona apenas para strings. Não podemos usar isso para números.

Para obter a matriz classificada com base em alguma propriedade numérica, temos que fornecer alguma função de comparação no método sort() porque o método de classificação normalmente também não funciona com números.

Veja o código abaixo.

let students = [
  {fname: 'Rohan', lname: 'Dalal', age: 19},

  {fname: 'Zain', lname: 'Ahmed', age: 21},

  {fname: 'Anadi', lname: 'Malhotra', age: 16}
];

students.sort((a, b) => {
  return a.age - b.age;
});
console.log(students);

O exemplo acima compara a idade dos objetos e os classifica com base nessa idade. A função de comparação é apenas uma única linha, portanto, é fornecida diretamente com o método sort(). Para obter tudo em ordem decrescente, use a função reverse().

Como alternativa, também podemos mudar a ordem na função de comparação para obter a saída final em ordem decrescente.

Por exemplo,

let students = [
  {fname: 'Rohan', lname: 'Dalal', age: 19},

  {fname: 'Zain', lname: 'Ahmed', age: 21},

  {fname: 'Anadi', lname: 'Malhotra', age: 16}
];

students.sort((a, b) => {
  return b.age - a.age;
});
console.log(students);

Produção:

[
  { fname: 'Zain', lname: 'Ahmed', age: 21 },
  { fname: 'Rohan', lname: 'Dalal', age: 19 },
  { fname: 'Anadi', lname: 'Malhotra', age: 16 }
]

Artigo relacionado - JavaScript Array