Erro ao analisar o maior valor quando este é 100

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!