2
respostas

[JavaScript: Conhecendo Objetos] [Módulo: 05 -Manipulando Lista de Objetos][Item: 09 - Lista de Exercícios] - Exercício 4

Oi pessoal, tudo bem?

Fiquei com uma dúvida no Exercício 4 do módulo 5, "manipulando objetos".

A resolução proposta coloca o método "sort" em uma função separada (ordenarAnimais) do cálculo desse sort, que ficou na função "ompararIdadeCrescente". Porém não está claro pra mim como é que o método "sort" é reconhece as variáveis "a" e "b" uma vez que ele não é passado como predicado da função.

Para tentar isolar esse problema, tentei criar um "sort" sem passar o "a" e "b" como predicado e não deu certo. O que pra mim ficou estranho é que isoladamente *não funciona, mas dentro da função proposta funcionou normalmente. Por exemplo, fazendo o sort como abaixo eu tenho um erro de variáveis devido a não declaração do a e b:

animais.sort(a.idade - b.idade)

o correto seria:

animais.sort((a,b) => { a.idade - b.idade});

Enquanto que a resolução do exercício propõe:

animais.sort(comparacao);

E dá certo!

Será que tem uma forma de explicar ou de debugar esse trecho pra que eu possa compreender melhor?

Muuiito Obrigado

2 respostas

Pelo que entendi, a parte

animais.sort(a.idade - b.idade)

está errada porquê o a e o b não foram definidos corretamente, não foram passados em uma função. O método sort espera uma função de comparação que recebe dois parâmetros . Como a e b não foram passados em uma função, o JavaScript não sabe o que são essas variáveis

Na parte

animais.sort((a, b) => a.idade - b.idade);

Neste caso, a e b são parâmetros de uma função de comparação passada ao sort. O método sort usa essa função para comparar dois elementos do array.

Isso seria basicamente a mesma coisa de eu criar um função e colocar nesse metodo sort(), como por exemplo:

function compararIdade(a, b) {
  return a.idade - b.idade;
}

animais.sort(compararIdade);

Opa Gabriel, tudo bem? Obrigado por tentar entender o meu problema. As vezes expressar de forma resumida fica um pouco confuso. De qualquer forma, mesmo sua explicação estando bem mais clara que a minha, percebi que chegamos à mesma conclusão. No entanto, a minha maior dúvida está em outro ponto, que é a função "comparacao".

Se você analisar, ele não passa as variáveis 'a' e 'b' como parâmetros da função ordenarAnimais. Veja só:

function ordenarAnimais(comparacao) {
    return animais.sort(comparacao);
}

Mas na hora de instanciar a função que executa o cálculo da ordenação, o 'a' e o 'b' são passados como parâmetros:

function compararIdadeCrescente(a, b) {
    return a.idade - b.idade;

A minha grande questão é:

Como que o node sabe que na função "compararIdadeCrescente" sabe que o 'a' e 'b' são parâmetros de um "sort" que está em outra função, a função "ordenarAnimais" .

Acabei "aceitando" a resolução, mas realmente eu dei uma bugada aqui em como as coisas se conversam.