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

Erro implementando solução alternativa

Olá tenho bastante dificuldade com algoritmos e estava procurando implementar uma solução alternativa para ordenação da lista de livros.

let maisBarato = 0;
let livroOrdenado = [];

function Ordenador(arr){

  for (let i = 0; i < arr.length; i++) {
    if(arr[i].preco <= arr[maisBarato].preco){
    maisBarato = i;}
  }
  console.log(maisBarato)

  livroOrdenado.push(arr[maisBarato])
  arr.splice(maisBarato,1)

}

Ordenador(livros)
Ordenador(livros)
Ordenador(livros)

O processo que procurei implementar foi usando .push e .splice, o for loop traz o indice do menor valor, eu pego o indice .push em uma nova lista e removo ela da propria lista assim posso chamar novamente a funcao Ordenador(livros) para repetir o mesmo processo com a lista sem o menor valor repetindo o processo, posso colocar a propria funcao em outro loop, mas a funcao funciona apenas chamando ela 2 vezes na terceira ela vem com este erro:

/mnt/c/Users/sung/Desktop/Alura/2324-algoritmos-js-aula-1/index.js:11
    if(arr[i].preco <= arr[maisBarato].preco){
                                       ^

TypeError: Cannot read properties of undefined (reading 'preco')
    at Ordenador (/mnt/c/Users/sung/Desktop/Alura/2324-algoritmos-js-aula-1/index.js:11:40)
    at Object.<anonymous> (/mnt/c/Users/sung/Desktop/Alura/2324-algoritmos-js-aula-1/index.js:25:1)
    at Module._compile (node:internal/modules/cjs/loader:1101:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:17:47

nao consegui entender pq deste erro e pq o .preco estar indefinido

agradeco qualquer ajuda e direcao

Obs: Consegui resolver o problema trazendo o let maisBarato = 0; para dentro da função Ordenador, mas gerou outra dúvida, toda declaração global não é recebida dentro da função? se não , como a função estava funcionando nas 2 primeiras vezes que a função Ordenador foi chamado?

3 respostas

if(arr[i].preco <= arr[maisBarato].preco){ maisBarato = i;}

maisbarato = 0 - no inicio
depois recebe i que é igual a 0 também;

talvez fizesse assim:

 maisBarato = i+1;}
solução!

Exatamente como vc disse, o "let maisBarato = 0" precisa estar dentro da função, pq depois de "maisBarato = i" seu valor é redefinido pro valor de i (que é o indice / posição dentro do array), e depois da segunda vez q o FOR roda, seu valor se torna 4 (pois o livro da posição 4 se torna o mais barato) e como não existe mais a posição 4 dentro do array, (pois esta removendo os dados com splice) o programa da um erro por não encontrar mais nenhum livro na posição 4. Espero ter ajudado :)

Muito obrigado pela explicação Vinicius fiquei um tempão batendo a cabeça pra entender haha!!