Como verificar se um número está entre dois valores?

144

Em JavaScript, estou dizendo ao navegador para fazer algo se o tamanho da janela for maior que 500px. Eu faço assim:

if (windowsize > 500) {
    // do this
}

Isso funciona muito bem, mas eu gostaria de aplicar esse mesmo método, mas com um intervalo de números. Gostaria de dizer ao meu navegador para fazer coisas se o tamanho da janela estiver entre 500 e 600 pixels. Eu sei que isso não funcionaria, mas aqui está como eu imaginei:

if (windowsize > 500-600) {
    // do this
}

Isso é possível dentro do JavaScript?

Dyck
fonte
9
Parece um pouco duro para fechar esta questão. Posso votar para reabri-lo. Está bem escrito e fornece código de exemplo.
Caltor
Certamente a verificação mais correto seria se (WindowSize> = 500 && WindowSize <= 600) ou if ((WindowSize <500 || WindowSize!> 600))
SPlatten

Respostas:

225

Testa se windowsizeé maior que 500ou menor que 600o que significa que nem os valores 500nem a 600si mesmos resultarão na condição se tornar verdadeira.

if (windowsize > 500 && windowsize < 600) {
  // ...
}
Indefinido
fonte
1
obrigado indefinido, apenas para confirmar isso fará o que eu quero no navegador quando o tamanho da janela for maior que 500px e menor que 600px, funcionando essencialmente dentro do intervalo de 500-600px, correto? (Eu não sou muito bom com este lol coisas)
Dyck
1
@ DDck Sim, faz isso :), observe que o jQuery é apenas uma biblioteca JavaScript.
undefined
7
Lembre-se de que essa condição só é verdadeira quando windowsizetiver no mínimo 501 px e no máximo 599px. 500 px e 600 px são excluídos. Inclua igualdade nas comparações se desejar incluir esses valores.
Robert Koritnik
3
Apenas um detalhe, mas é mais legível da seguinte maneira:if(500 < windowsize && windowsize < 600)
Giovanni Benussi 17/06
119

Tive um momento, então, embora você já tenha aceitado uma resposta, pensei em contribuir com o seguinte:

Number.prototype.between = function(a, b) {
  var min = Math.min.apply(Math, [a, b]),
    max = Math.max.apply(Math, [a, b]);
  return this > min && this < max;
};

var windowSize = 550;

console.log(windowSize.between(500, 600));

Demonstração JS Fiddle .

Ou, se você preferir ter a opção de verificar se um número está no intervalo definido, incluindo os pontos finais :

Number.prototype.between = function(a, b, inclusive) {
  var min = Math.min.apply(Math, [a, b]),
    max = Math.max.apply(Math, [a, b]);
  return inclusive ? this >= min && this <= max : this > min && this < max;
};

var windowSize = 500;

console.log(windowSize.between(500, 603, true));

Demonstração JS Fiddle .

Editado para adicionar uma pequena alteração ao exposto acima, pois, conforme observado nos comentários,

... Function.prototype.apply()é lento! Além de chamá-lo quando você tem uma quantidade fixa de argumentos, é inútil…

valeu a pena remover o uso de Function.prototype.apply(), que produz as versões alteradas dos métodos acima, primeiro sem a opção 'inclusiva':

Number.prototype.between = function(a, b) {
  var min = Math.min(a, b),
    max = Math.max(a, b);

  return this > min && this < max;
};

var windowSize = 550;

console.log(windowSize.between(500, 600));

Demonstração JS Fiddle .

E com a opção 'inclusiva':

Number.prototype.between = function(a, b, inclusive) {
  var min = Math.min(a, b),
    max = Math.max(a, b);

  return inclusive ? this >= min && this <= max : this > min && this < max;
}

var windowSize = 500;

console.log(windowSize.between(500, 603, true));

Demonstração JS Fiddle .

Referências:

David diz para restabelecer Monica
fonte
6
por que usar apply em vez de ligar diretamente como Main.min(a,b)? Function.prototype.apply está lento! Além de chamá-lo quando você tem uma quantidade fixa de argumentos, é inútil.
Steel Brain
Vou adicionar isso à minha caixa de ferramentas padrão - muito útil e obrigado por esta contribuição!
SidOfc
@ SteelBrain: você tem razão! Atualizei a resposta para refletir isso, apesar de suspeitar que eu tinha - inicialmente - um motivo para usá-lo Function.prototype.apply(), mas não consigo pensar no que era ou poderia ter sido.
David diz que restabelece Monica
6
É MUITO melhor criar uma função que não modifique o Numberobjeto. Este é um antipadrão e o incomodará se os padrões da ECMA mudarem para incluir uma Number.between()função ou se outra biblioteca ou outro trecho de código definir em Number.prototype.betweenoutro lugar com uma definição diferente. Em vez disso, crie uma função auxiliar e use isso!
Monarch Wadia
2
@MonarchWadia Embora seu argumento faça sentido que modificar / estender objetos nativos é uma prática ruim, sinto que é um pouco redundante ter isso pregado em todos os lugares (sem ofensa). Não consigo contar as vezes que vi "não modificar objetos nativos". Para mim, é como alguém que vende facas domésticas avisando o comprador sobre os possíveis perigos da faca toda vez que ele vende um como se fosse de responsabilidade do vendedor se houver algum dano. Os perigos devem ser de conhecimento comum. Cabe ao usuário se ele / ela os ignora ou não.
akinuri
80

Prefiro colocar a variável por dentro para dar uma dica extra de que o código está validando minha variável está entre os valores de um intervalo

if (500 < size && size < 600) { doStuff(); }
David
fonte
13
eu gosto desse estilo! adaptará que :)
Kaii
2
Esta é a minha preferência, já que é mais perto do python min < testval < maxsintaxe
daveruinseverything
@GouravChawla, você está falando sobre o exemplo de trecho de código nesta resposta? Meu snippet de código foi Python, usado para comparação
daveruinseverything
@GouravChawla ninguém disse o contrário. Não está claro o que você está discordando.
daveruinseverything 13/04
28

É uma pergunta antiga, mas pode ser útil para alguém como eu.

lodashtem a _.inRange()função https://lodash.com/docs/4.17.4#inRange

Exemplo:

_.inRange(3, 2, 4);
// => true

Observe que esse método utiliza a Lodashbiblioteca de utilitários e requer acesso a uma versão instalada do Lodash.

antongorodezkiy
fonte
2
Esteja ciente de que o valor final não está incluído. por exemplo. _.inRange(10, 0, 10) // => false
Lucio
Como o OP limitou o escopo da pergunta Javascript, é importante observar que esse método utiliza a Lodashbiblioteca de utilitários e requer acesso a uma versão instalada do Lodash.
Chaya Cooper
2

Você pode usar a cláusula Multiple na ifcondição em vez de escrever

if (windowsize > 500-600) {
    // do this
}

porque isso realmente não faz sentido, logicamente, o JavaScript lerá sua condição if como

windowSize > -100 

porque calcula 500-600para-100

Você deve usar &&para verificar rigorosamente os dois casos, por exemplo, que terão esta aparência

if( windowSize > 500 && windowSize < 600 ){

// Then doo something

}
Hanzla Habib
fonte
0

Acabei de implementar esse jQuery para mostrar e ocultar valores modais de inicialização. Diferentes campos são exibidos com base no intervalo de valores de uma entrada da caixa de texto dos usuários.

$(document).ready(function () {
    jQuery.noConflict();
    var Ammount = document.getElementById('Ammount');

    $("#addtocart").click(function () {

            if ($(Ammount).val() >= 250 && $(Ammount).val() <= 499) {
                {
                    $('#myModal').modal();
                    $("#myModalLabelbronze").show();
                    $("#myModalLabelsilver").hide();
                    $("#myModalLabelgold").hide();
                    $("#myModalPbronze").show();
                    $("#myModalPSilver").hide();
                    $("#myModalPGold").hide();
                }
            }
    });
WiseGuy
fonte
6
Usando jQuery para funções triviais foi em 2013 talvez uma opção, mas não é de hoje
mgamsjager
3
Verdade, mas eu sou gente com medo ainda vai usá-lo hoje
mgamsjager
1
Por curiosidade: por que o jQuery é pior para usar funções triviais agora do que então?
Jul16
2
@Julix principalmente desempenho, embora insignificante neste caso. O ponto geral seria "não use jQuery quando não for necessário", mas esses comentários não são o lugar para (re) iniciar o debate. divirta-se com isso embora :) i.stack.imgur.com/sGhaO.gif
Luca
Esta é apenas uma implementação da solução. O OP já tem acesso aos valores. Portanto, o jQuery $().val()é irrelevante e não é necessário. Porém, novamente, na versão original da pergunta, o OP menciona o jQuery, para uma verificação aritmética simples. (suspiro) Esse é o primeiro erro.
akinuri
0

Aqui está o método mais curto possível:

if (Math.abs(v-550)<50) console.log('short')
if ((v-500)*(v-600)<0) console.log('short')

Parametrizado:

if (Math.abs(v-max+v-min)<max+min) console.log('short')
if ((v-min)*(v-max)<0) console.log('short')

Você pode dividir os dois lados por 2 se não entender como o primeiro funciona;)

yukashima huksay
fonte