Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Comportamento estranho

Como a idéia era criar uma "ordenação" após seguir o passo a passo da instrutora, eu decidi por utilizar o método "sort()" para além de imprimir o valor mais barato, ele me mostrar a nova ordem:

const precoLivros = [25, 15, 30, 50, 45, 20];

let maisBarato = 0;

for (let atual = 0; atual < precoLivros.length; atual++) {
    if (precoLivros[atual] < precoLivros[maisBarato]) {
        maisBarato = atual;
    }
    console.log(`let atual: ${atual} / let maisBarato: ${maisBarato}`);
} 

const livrosOrdenados = precoLivros.sort((a, b) => a - b);

console.log(`O livro mais barato custa: R$${precoLivros[maisBarato]}`);
console.log(livrosOrdenados);

Porém, ele me imprimiu o resultado de menor valor como sendo o "20" e não o "15". Para entender melhor o comportamento, eu coloquei(seguindo um exemplo de uma das respostas dada nesse tópico) um log pra poder verificar o comportamento do código e do jeito que esta escrito acima, o resultado imprimido foi:

" let atual: 0 / let maisBarato: 0 let atual: 1 / let maisBarato: 1 let atual: 2 / let maisBarato: 1 let atual: 3 / let maisBarato: 1 let atual: 4 / let maisBarato: 1 let atual: 5 / let maisBarato: 1 O livro mais barato custa: R$20 [ 15, 20, 25, 30, 45, 50 ] "

Quando eu jogo a "const livrosOrdenados" para a segunda linha no código assim:

const precoLivros = [25, 15, 30, 50, 45, 20];
const livrosOrdenados = precoLivros.sort((a, b) => a - b);
let maisBarato = 0;

for (let atual = 0; atual < precoLivros.length; atual++) {
    if (precoLivros[atual] < precoLivros[maisBarato]) {
        maisBarato = atual;
    }
    console.log(`let atual: ${atual} / let maisBarato: ${maisBarato}`);
} 


console.log(`O livro mais barato custa: R$${precoLivros[maisBarato]}`);
console.log(livrosOrdenados);

Ele se comporta exatamente como deveria: " let atual: 0 / let maisBarato: 0 let atual: 1 / let maisBarato: 0 let atual: 2 / let maisBarato: 0 let atual: 3 / let maisBarato: 0 let atual: 4 / let maisBarato: 0 let atual: 5 / let maisBarato: 0 O livro mais barato custa: R$15 [ 15, 20, 25, 30, 45, 50 ] "

Mesmo entendendo um pouco que esse comportamento se dá a forma como o código lê a ordem das linhas, por que que no primeiro exemplo ele seguiu corretamente a lógica do for até chegar na const, mas a partir dela ele trocou o resultado?

2 respostas
solução!

Olá, Leonardo!

Entendo que você está com uma dúvida sobre o comportamento do método sort() em JavaScript. Vou tentar te ajudar a entender o que está acontecendo.

Quando você utiliza o método sort() para ordenar o array precoLivros, ele altera a ordem dos elementos no próprio array. Por isso, quando você imprime o valor de precoLivros[maisBarato] após chamar o sort(), o resultado não é o esperado.

No primeiro exemplo de código que você mostrou, você está utilizando o sort() antes de percorrer o array e encontrar o livro mais barato. Portanto, a ordem dos elementos já foi alterada antes de você imprimir o valor de precoLivros[maisBarato]. É por isso que o resultado é "20" em vez de "15".

No segundo exemplo de código que você mostrou, você percorre o array e encontra o livro mais barato antes de chamar o sort(). Então, quando você imprime o valor de precoLivros[maisBarato], ele ainda é "15". Em seguida, você chama o sort() e imprime o array ordenado corretamente.

Portanto, a ordem em que você chama as funções sort() e console.log() faz diferença no resultado final.

Espero que isso esclareça a sua dúvida. Se tiver mais alguma pergunta, é só me dizer! Espero ter ajudado e bons estudos!

Ajudou, obrigado.