5
respostas

Dúvida no retorno -1 do método sort()

"Se funcaoDeComparacao(a, b) for menor que 0, ordena a para um índice anterior a b, i.e. a vem primeiro.".

Eu entendi que o "a" vem primeiro, mas quando comparamos o "a" já é o primeiro elemento que está sendo comparado com o "b" que é o segundo elemento, então não deveria mudar de posição se o "a" já está antes de "b". Nesse caso, caso dê 0 ou -1 seria a mesma coisa. Mas não é o que acontece, pois acontece a inversão, ou seja, o "b" vem antes do "a" e o "a" vem depois do "b", igual quando o resultado é 1. Não entendi por que ocorre essa inversão.

Código:

const items = [
    { name: "Ana", age: 25 },
    { name: "Ana", age: 30 }
];
  
items.sort((a, b) => {
if (a.name === b.name) return -1; // Força que "a" sempre venha antes de "b"
else return a.name.localeCompare(b.name);
});

console.log(items);
5 respostas

Oi Luidi,

A sua dúvida é bem comum e surge da interpretação de como o sort() funciona internamente. 🤔

O método sort() não compara apenas o primeiro e o segundo elemento uma única vez. Ele realiza diversas comparações entre os elementos do array para garantir a ordenação correta.

Quando você retorna -1 na função de comparação, você está dizendo ao sort() que, para aquela comparação específica, o elemento a deve vir antes do b.

O sort() usa essa informação para ajustar a posição dos elementos no array, mas não necessariamente de forma direta e imediata como você imaginou. Ele pode comparar a com outros elementos além de b e usar o resultado da sua função de comparação para determinar a posição final de a.

Para saber mais: Documentação do método sort()

Continue praticando e explorando o JavaScript! 💪 💻

tux matrix Caso este post o tenha ajudado, marque-o como solucionado ☑️. Bons Estudos! 🤓

Quantas comparações são feitas nesse caso? Por que os elementos são trocados de posição? No meu entendimento não deveria ocorrer a troca, pois o -1 faz com que o "a" fique antes de "b", o que já ocorre.

Código:

const items = [
    { name: "Ana", age: 25 },
    { name: "Ana", age: 30 }
];
  
items.sort((a, b) => {
if (a.name === b.name) return -1; // Força que "a" sempre venha antes de "b"
else return a.name.localeCompare(b.name);
});

console.log(items);

Testando com o retorno de 1, que faz com que o "a" venha depois de "b", porém não ocorre a troca, ou seja, "a" fica antes de "b", por que isso ocorre? É como se o retorno de -1 e 1 estivesse invertido.

const items = [
    { name: "Ana", age: 25 },
    { name: "Ana", age: 30 }
];
  
items.sort((a, b) => {
if (a.name === b.name) return 1; // Força que "a" sempre venha antes de "b"
else return a.name.localeCompare(b.name);
});

console.log(items);

Luidi,

O método sort() em JavaScript faz comparações entre pares de elementos e usa o valor retornado pela função de comparação para determinar a ordem.

No seu exemplo, como temos 2 elementos, é realizada 1 comparação.

Valores de Retorno

  • Retorno negativo (-1): indica que "a" deve vir antes de "b"
  • Retorno positivo (1): indica que "a" deve vir depois de "b"
  • Retorno zero (0): indica que a ordem deve permanecer inalterada

Análise do Código

No primeiro exemplo:

if (a.name === b.name) return -1;

Quando os nomes são iguais ("Ana" === "Ana"), o retorno é -1, indicando que a ordem atual deve ser mantida. Como os elementos já estão na ordem desejada (age: 25 antes de age: 30), nenhuma troca é necessária.

No segundo exemplo:

if (a.name === b.name) return 1;

Mesmo retornando 1, que teoricamente deveria trocar as posições, a ordem permanece a mesma porque o algoritmo de ordenação é estável, o que significa que ele mantém a ordem relativa de elementos iguais.

Comportamento Esperado

Para realmente alterar a ordem dos elementos com o mesmo nome, você precisaria comparar também a idade:

items.sort((a, b) => {
    if (a.name === b.name) {
        return b.age - a.age; // Ordena por idade decrescente
    }
    return a.name.localeCompare(b.name);
});

Você disse que quando retornado "-1" a ordem deve ser mantida, mas não é isso que acontece, ocorre a troca! E quando retornado "1" que deveria ocorrer a troca não ocorre devido ao funcionamento interno do sort()? O sort() ignora o retorno "1", pois os elementos são iguais?

duvida