Olá, amigos! Gostaria que alguém me axuliasse num problema: o programa funcionar bem, no entanto, quando eu insiro o valor 100 (o maior valor, pois o usuário só pode inserir números de 1 a 100) o programa não o considera como o maior. Ex: na lista 1, 6, 4, 100; ele vai considerar o 6 como o maior valor.
let guardaVal = new Array()
function adicionar(){
let i = Number(num.value)
if(guardaVal.indexOf(i) != -1 || i == 0 || i > 100){
window.alert('Valor inválido ou já encontrado na lista!')
} else {
let item = document.createElement('option')
item.text += `O valor ${i} foi adicionado`
select.appendChild(item)
guardaVal.push(i)
}
}
function finalizar(){
guardaVal.sort()
let ultm = guardaVal[guardaVal.length - 1]
result.innerHTML = `No total, foram ${guardaVal.length} números inseridos<br><br>`
result.innerHTML += `O maior valor digitado foi o ${ultm} <br><br>`
result.innerHTML += `O menor valor informado foi o ${guardaVal[0]} <br><br>`
}
}
OBS: eu omiti certar partes do código por julgá-las como não tem ligação com este problema (porque o programa tem outras funcionaliadades), mas pode ser que eu tenha deixado uma parte importante fora. Caso isso tenha acontecido, me avisem que eu posto o código inteiro.
Essa lógica para achar o maior e o menor número tá errada. Aí, vc tá encontrando só o primeiro e o ultimo número na lista. Então na lista [1, 4, 3]
, por exemplo, ele vai retornar o número 3 como maior, mas deveria retornar o 4.
Dá uma olhada nessa implementação aqui:
let maiorNum = 0;
let menorNum = 999; // um número grande que nunca vai existir na lista
let numeros = [1, 8, 4, 100];
numeros.forEach((numero) => {
if (numero < menor)
menor = numero;
if (numero > maior)
maior = numero;
});
console.log('Maior:', maior, '\nMenor:', menor);
1 curtida
Não, não, eu coloco os vetores em ordem crescente primeiro (.sort()). Assim, se estão em ordem crescente, concorda que o primeiro é o menor e o último o maior?
Eu conheço esse jeito que vc propôs, é que eu tô tentando resolver dessa forma (com o .sort()). Mesmo assim, muito obrigado pela resposta, amigo!
O problema é que o método sort
, por padrão, converte os valores para string antes de ordenar - comportamento descrito na documentação e na especificação da linguagem - e compara-os lexicograficamente (ou seja, na “ordem alfabética”).
E aí 100
acaba sendo “menor” que 6
, por exemplo, pois os dígitos são tratados como meros caracteres e a ordenação leva em conta a ordem lexicográfica (e não numérica).
Para ordenar de acordo com o valor numérico, vc precisa passar um callback para sort
, veja a diferença:
var guardaVal = [100, 2, 6, 1];
// ordena pela ordem lexicográfica
guardaVal.sort();
console.log(guardaVal); // 1,100,2,6
// passando callback, ordena pelo valor numérico
guardaVal.sort((a, b) => a - b);
console.log(guardaVal); // 1,2,6,100
1 curtida
aaah entendi. Deve ser por isso que às vezes o.sort
dava uns bugs. Eu já tinha ouvido falar sobre o callback, mas era uma ideia bastante rasa. Vou ler mais sobre eles. Obrigado pela ajuda, amigo!