Wie überprüfe ich, ob eine Zahl zwischen zwei Werten liegt?

144

In JavaScript fordere ich den Browser auf, etwas zu tun, wenn die Fenstergröße größer als 500 Pixel ist. Ich mache es so:

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

Das funktioniert gut, aber ich möchte dieselbe Methode anwenden, aber mit einer Reihe von Zahlen. Daher möchte ich meinem Browser mitteilen, dass er Dinge tun soll, wenn die Fenstergröße zwischen 500 und 600 Pixel liegt. Ich weiß, dass das nicht funktionieren würde, aber so habe ich es mir vorgestellt:

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

Ist das in JavaScript überhaupt möglich?

Dyck
quelle
9
Scheint ein bisschen hart, um diese Frage zu schließen. Kann ich abstimmen, um es wieder zu öffnen? Es ist gut geschrieben und gibt Beispielcode.
Caltor
Sicherlich wäre die korrektere Prüfung, ob (
Windows-Größe

Antworten:

225

Testet, ob windowsizegrößer 500oder kleiner als ist, 600was bedeutet, dass weder Werte 500noch sich 600selbst dazu führen, dass die Bedingung wahr wird.

if (windowsize > 500 && windowsize < 600) {
  // ...
}
nicht definiert
quelle
1
danke undefined, nur um zu bestätigen, dass dies im Browser das tut, was ich will, wenn die Fenstergröße größer als 500px und kleiner als 600px ist und im Wesentlichen nur im Bereich von 500-600px funktioniert, richtig? (Ich bin nicht so gut mit diesem Zeug lol)
Dyck
1
@Dyck Ja, das tut es :), beachte, dass jQuery nur eine JavaScript-Bibliothek ist.
undefiniert
7
windowsizeBeachten Sie, dass diese Bedingung nur dann erfüllt ist, wenn sie mindestens 501 Pixel und höchstens 599 Pixel beträgt. 500px und 600px sind ausgeschlossen. Fügen Sie Vergleichen Gleichheit hinzu, wenn Sie diese Werte einbeziehen möchten.
Robert Koritnik
3
Nur ein Detail, aber auf folgende Weise besser lesbar:if(500 < windowsize && windowsize < 600)
Giovanni Benussi
119

Ich hatte einen Moment Zeit, obwohl Sie bereits eine Antwort akzeptiert haben, dachte ich, ich würde Folgendes beitragen:

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

JS Fiddle Demo .

Wenn Sie lieber die Option haben möchten, zu überprüfen, ob eine Zahl im definierten Bereich einschließlich der Endpunkte liegt :

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

JS Fiddle Demo .

Bearbeitet, um eine geringfügige Änderung zu den oben genannten hinzuzufügen, da - wie in den Kommentaren angegeben -

Function.prototype.apply()Ist langsam! Abgesehen davon, dass es sinnlos ist, es aufzurufen, wenn Sie eine feste Anzahl von Argumenten haben ...

Es hat sich gelohnt, die Verwendung von zu entfernen Function.prototype.apply(), was die geänderten Versionen der oben genannten Methoden ergibt, zunächst ohne die Option "inklusive":

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

JS Fiddle Demo .

Und mit der Option "Inklusive":

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

JS Fiddle Demo .

Verweise:

David sagt, Monica wieder einsetzen
quelle
6
Warum verwenden, anstatt direkt wie Main.min(a,b)anzurufen? Function.prototype.apply ist langsam! Außerdem ist es sinnlos, es aufzurufen, wenn Sie eine feste Anzahl von Argumenten haben.
Steel Brain
Ich werde dies zu meiner Standard-Toolbox hinzufügen - sehr praktisch und danke für diesen Beitrag!
SidOfc
@SteelBrain: Du hast einen Punkt! Ich habe die Antwort aktualisiert, um dies widerzuspiegeln, obwohl ich vermute, dass ich anfangs einen Grund für die Verwendung hatte Function.prototype.apply(), aber ich kann mir nicht vorstellen, was es war oder gewesen sein könnte.
David sagt, Monica am
6
Es ist VIEL besser, eine Funktion zu erstellen, die das NumberObjekt nicht ändert . Dies ist ein Anti-Pattern und wird Sie beißen, wenn sich die ECMA-Standards ändern, um eine Number.between()Funktion einzuschließen , oder wenn eine andere Bibliothek oder ein anderer Code an Number.prototype.betweenanderer Stelle mit einer anderen Definition definiert wird. Erstellen Sie stattdessen eine Hilfsfunktion und verwenden Sie diese!
Monarch Wadia
2
@MonarchWadia Obwohl es sinnvoll ist, native Objekte zu ändern / zu erweitern, ist es meiner Meinung nach etwas überflüssig, dies überall zu predigen (keine Beleidigung). Ich kann nicht zählen, wie oft "native Objekte nicht ändern" angezeigt wurde. Für mich ist dies so, als würde jemand Haushaltsmesser verkaufen, der den Käufer jedes Mal vor den möglichen Gefahren des Messers warnt, wenn er eines verkauft, wie es die Verantwortung des Verkäufers ist, wenn es Schaden gibt. Die Gefahren sollten allgemein bekannt sein. Es sollte Sache des Benutzers sein, ob er sie ignoriert oder nicht.
Akinuri
80

Ich ziehe es vor, die Variable nach innen zu setzen, um einen zusätzlichen Hinweis darauf zu geben, dass der Code überprüft, ob meine Variable zwischen einem Bereich liegt

if (500 < size && size < 600) { doStuff(); }
David
quelle
13
Ich mag diesen Stil! werde das anpassen :)
Kaii
2
Dies ist meine Präferenz, da es näher an der Python- min < testval < maxSyntax liegt
daveruinseverything
@GouravChawla Sprechen Sie über das Code-Snippet-Beispiel in dieser Antwort? Mein Code-Snippet war Python, das zum Vergleich verwendet wurde
daveruinseverything
@GouravChawla niemand sagte etwas anderes. Es ist unklar, womit Sie nicht einverstanden sind.
daveruinseverything
28

Es ist eine alte Frage, könnte aber für jemanden wie mich nützlich sein.

lodashhat die _.inRange()Funktion https://lodash.com/docs/4.17.4#inRange

Beispiel:

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

Bitte beachten Sie, dass diese Methode die verwendet Lodash Dienstprogrammbibliothek verwendet und Zugriff auf eine installierte Version von Lodash erfordert.

antongorodezkiy
quelle
2
Bitte beachten Sie, dass der Endwert nicht enthalten ist. z.B. _.inRange(10, 0, 10) // => false
Lucio
Da das OP den Fragenbereich auf beschränkt hat Javascript, ist anzumerken, dass diese Methode die LodashDienstprogrammbibliothek verwendet und Zugriff auf eine installierte Version von Lodash erfordert.
Chaya Cooper
2

Sie können die Multiple-Klausel unter bestimmten ifBedingungen verwenden, anstatt zu schreiben

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

weil dies logischerweise wirklich keinen Sinn macht, liest JavaScript Ihre if-Bedingung wie

windowSize > -100 

weil es berechnet 500-600zu-100

Sie sollten &&zum Beispiel beide Fälle streng prüfen, die so aussehen

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

// Then doo something

}
Hanzla Habib
quelle
0

Ich habe gerade dieses Bit von jQuery implementiert, um die modalen Bootstrap-Werte ein- und auszublenden. Abhängig vom Wertebereich eines Benutzer-Textfeldeintrags werden verschiedene Felder angezeigt.

$(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();
                }
            }
    });
Klugscheißer
quelle
6
Die Verwendung von jQuery für triviale Funktionen war 2013 vielleicht eine Option, ist es aber heute nicht
mgamsjager
3
Stimmt, aber ich fürchte, die Leute werden es heute noch benutzen
mgamsjager
1
Aus Neugier: Warum ist jQuery heute schlechter für triviale Funktionen als damals?
Julix
2
@ Julix meistens Leistung, wenn auch in diesem Fall vernachlässigbar. Der allgemeine Punkt wäre "Verwenden Sie jQuery nicht, wenn es nicht notwendig ist", aber diese Kommentare sind nicht der Ort, um die Debatte (neu) zu starten. Viel
Luca
Dies ist nur eine Implementierung der Lösung. OP hat bereits Zugriff auf die Werte. JQuery $().val()ist also irrelevant und nicht notwendig. In der Originalversion der Frage erwähnt OP jedoch jQuery für eine einfache arithmetische Prüfung. (seufzt) Das ist der erste Fehler.
Akinuri
0

Hier ist die kürzeste mögliche Methode:

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

Parametrisiert:

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

Sie können beide Seiten durch 2 teilen, wenn Sie nicht verstehen, wie die erste funktioniert;)

Yukashima Huksay
quelle