Comment vérifier si un nombre est entre deux valeurs?


144

En JavaScript, je dis au navigateur de faire quelque chose si la taille de la fenêtre est supérieure à 500px. Je le fais comme ça:

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

Cela fonctionne très bien, mais j'aimerais appliquer cette même méthode, mais avec une plage de nombres. Je voudrais donc dire à mon navigateur de faire des choses si la taille de la fenêtre est comprise entre 500px et 600px. Je sais que cela ne fonctionnerait pas, mais voici comment je l'ai imaginé:

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

Est-ce même possible, dans JavaScript?


9
Cela semble un peu dur de fermer cette question. Puis-je voter pour le rouvrir. Il est bien écrit et donne un exemple de code.
Caltor

La vérification la plus correcte serait certainement if (windowsize> = 500 && windowsize <= 600) ou if (! (Windowsize <500 || windowsize> 600))
SPlatten le

Réponses:


225

Teste si windowsizeest supérieur 500et inférieur à 600ce qui signifie qu'aucune des valeurs 500ou 600elle-même ne fera que la condition deviendra vraie.

if (windowsize > 500 && windowsize < 600) {
  // ...
}

1
merci indéfini, juste pour confirmer que cela fera ce que je veux dans le navigateur lorsque la taille de la fenêtre est supérieure à 500px et inférieure à 600px, fonctionnant essentiellement dans la plage de 500-600px uniquement, correct? (Je ne suis pas trop bon avec ce truc lol)
Dyck

1
@Dyck Oui, c'est le cas :), notez que jQuery n'est qu'une bibliothèque JavaScript.
undefined

7
windowsizeGardez à l' esprit que cette condition n'est vraie que si elle est d'au moins 501px et au plus 599px. 500px et 600px sont exclus. Ajoutez l'égalité aux comparaisons si vous souhaitez inclure ces valeurs.
Robert Koritnik

3
Juste un détail, mais est plus lisible de la manière suivante:if(500 < windowsize && windowsize < 600)
Giovanni Benussi

119

J'ai eu un moment, donc, bien que vous ayez déjà accepté une réponse, j'ai pensé que je contribuerais comme suit:

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));

Démo de JS Fiddle .

Ou, si vous préférez avoir la possibilité de vérifier qu'un nombre est dans la plage définie, y compris les points d'extrémité :

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));

Démo de JS Fiddle .

Modifié pour ajouter un amendement mineur à ce qui précède, étant donné que - comme indiqué dans les commentaires -

Function.prototype.apply()Est lent! En plus de l'appeler quand vous avez un nombre fixe d'arguments est inutile ...

il valait la peine de supprimer l'utilisation de Function.prototype.apply(), qui donne les versions modifiées des méthodes ci-dessus, tout d'abord sans l'option `` inclusive '':

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));

Démo de JS Fiddle .

Et avec l'option 'inclusive':

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));

Démo de JS Fiddle .

Références:


6
pourquoi utiliser apply au lieu d'appeler directement comme Main.min(a,b)? Function.prototype.apply est lent! En plus de l'appeler lorsque vous avez un nombre fixe d'arguments, il est inutile.
Steel Brain

Je vais l'ajouter à ma boîte à outils par défaut - très pratique et merci pour cette contribution!
SidOfc

@SteelBrain: vous avez raison! J'ai mis à jour la réponse pour refléter cela, bien que je soupçonne que j'avais - au départ - une raison de l'utiliser Function.prototype.apply(), mais je ne peux pas penser ce que c'était, ou aurait pu être.
David dit de réintégrer Monica le

6
il est BEAUCOUP préférable de créer une fonction qui ne modifie pas l' Numberobjet. Ceci est un anti-pattern et viendra vous mordre si les normes ECMA changent pour inclure une Number.between()fonction, ou si une autre bibliothèque ou un autre morceau de code définit Number.prototype.betweenailleurs avec une définition différente. Au lieu de cela, créez une fonction d'aide et utilisez-la!
Monarch Wadia

2
@MonarchWadia Bien que votre argument soit logique que modifier / étendre des objets natifs est une mauvaise pratique, je pense que c'est un peu redondant de le prêcher partout (sans offense). Je ne peux pas compter les fois où j'ai vu "ne pas modifier les objets natifs". Pour moi, c'est comme si quelqu'un vendant des couteaux ménagers avertissait l'acheteur des dangers possibles du couteau chaque fois qu'il en vend un, comme si c'était la responsabilité du vendeur en cas de dommage. Les dangers devraient être de notoriété publique. Ce devrait être à l'utilisateur s'il les ignore ou non.
akinuri

80

Je préfère mettre la variable à l'intérieur pour donner un indice supplémentaire que le code valide ma variable est entre une plage de valeurs

if (500 < size && size < 600) { doStuff(); }

13
J'aime ce style! va adapter ça :)
Kaii

2
C'est ma préférence, car elle est plus proche de la min < testval < maxsyntaxe de python
daveruinseverything

@GouravChawla parlez-vous de l'exemple d'extrait de code dans cette réponse? Mon extrait de code était Python, utilisé à des fins de comparaison
daveruinseverything

@GouravChawla personne n'a dit le contraire. Ce avec quoi vous n'êtes pas d'accord n'est pas clair.
daveruinseverything le

28

C'est une vieille question, mais qui pourrait être utile pour quelqu'un comme moi.

lodasha la _.inRange()fonction https://lodash.com/docs/4.17.4#inRange

Exemple:

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

Veuillez noter que cette méthode utilise la Lodashbibliothèque utilitaire et nécessite l'accès à une version installée de Lodash.


2
Veuillez noter que la valeur finale n'est pas incluse. par exemple. _.inRange(10, 0, 10) // => false
Lucio

Comme l'OP a limité la portée de la question à Javascript, il convient de noter que cette méthode utilise la Lodashbibliothèque utilitaire et nécessite l'accès à une version installée de Lodash.
Chaya Cooper

2

Vous pouvez utiliser la clause Multiple en ifcondition au lieu d'écrire

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

car cela n'a vraiment aucun sens, logiquement, JavaScript lira votre condition if comme

windowSize > -100 

car il calcule 500-600à-100

Vous devriez utiliser &&pour vérifier strictement les deux cas, par exemple, ce qui ressemblera à ceci

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

// Then doo something

}

0

Je viens d'implémenter ce bit de jQuery pour afficher et masquer les valeurs modales de bootstrap. Différents champs sont affichés en fonction de la plage de valeurs d'une entrée de zone de texte utilisateur.

$(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();
                }
            }
    });

6
L'utilisation de jQuery pour des fonctions triviales était peut-être en 2013 une option, mais ce n'est pas le cas aujourd'hui
mgamsjager

3
C'est vrai, mais j'ai peur que les gens l'utilisent encore aujourd'hui
mgamsjager

1
Par curiosité: pourquoi jQuery est-il pire à utiliser pour des fonctions triviales maintenant qu'alors?
Julix

2
@Julix principalement des performances, quoique négligeables dans ce cas. Le point général serait "n'utilisez pas jQuery quand ce n'est pas nécessaire" mais ces commentaires ne sont pas le lieu pour (re) démarrer le débat. amusez-vous bien avec ça :) i.stack.imgur.com/sGhaO.gif
Luca

Ceci est juste une implémentation de la solution. OP a déjà accès aux valeurs. Donc jQuery $().val()n'est pas pertinent et n'est pas nécessaire. Mais encore une fois, dans la version originale de la question, OP mentionne jQuery, pour une simple vérification arithmétique. (soupir) C'est la première erreur.
akinuri

0

Voici la méthode la plus courte possible:

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

Paramétré:

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

Vous pouvez diviser les deux côtés par 2 si vous ne comprenez pas comment le premier fonctionne;)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.