Jak sprawdzić, czy liczba znajduje się między dwiema wartościami?

144

W JavaScript mówię przeglądarce, aby coś zrobiła, jeśli rozmiar okna jest większy niż 500 pikseli. Robię to tak:

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

To działa świetnie, ale chciałbym zastosować tę samą metodę, ale z zakresem liczb. Dlatego chciałbym powiedzieć mojej przeglądarce, aby zrobiła coś, jeśli rozmiar okna wynosi od 500 do 600 pikseli. Wiem, że to nie zadziała, ale tak sobie wyobrażałem:

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

Czy jest to w ogóle możliwe w JavaScript?

Dyck
źródło
9
Zamknięcie tego pytania wydaje się nieco trudne. Czy mogę zagłosować za jego ponownym otwarciem. Jest dobrze napisany i zawiera przykładowy kod.
Caltor
Z pewnością bardziej poprawne sprawdzenie byłoby, jeśli (windowsize> = 500 && windowsize <= 600) lub if (! (Windowsize <500 || windowsize> 600))
SPlatten

Odpowiedzi:

225

Sprawdza, czy wartość windowsizejest większa 500i mniejsza niż 600oznacza, że ​​żadna z wartości 500ani 600sama nie spowoduje, że warunek stanie się prawdziwy.

if (windowsize > 500 && windowsize < 600) {
  // ...
}
nieokreślony
źródło
1
dzięki niezdefiniowane, tylko po to, żeby potwierdzić, że zrobię to, co chcę w przeglądarce, gdy rozmiar okna jest większy niż 500 pikseli i mniejszy niż 600 pikseli, zasadniczo działa tylko w zakresie 500-600 pikseli, prawda? (Nie jestem zbyt dobry z tymi rzeczami lol)
Dyck
1
@Dyck Tak, robi to :), zwróć uwagę, że jQuery to tylko biblioteka JavaScript.
undefined
7
Pamiętaj, że ten warunek jest prawdziwy tylko wtedy, gdy windowsizema co najmniej 501 pikseli i co najwyżej 599 pikseli. 500px i 600px są wykluczone. Dodaj równość do porównań, jeśli chcesz uwzględnić te wartości.
Robert Koritnik
3
Tylko szczegół, ale jest bardziej czytelny w następujący sposób:if(500 < windowsize && windowsize < 600)
Giovanni Benussi
119

Miałem chwilę, więc chociaż już zaakceptowałeś odpowiedź, pomyślałem, że wniesie co następuje:

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

Demo JS Fiddle .

Lub, jeśli wolisz mieć możliwość sprawdzenia, czy liczba należy do zdefiniowanego zakresu, w tym punktów końcowych :

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

Demo JS Fiddle .

Zredagowano w celu dodania drobnej poprawki do powyższego, biorąc pod uwagę, że - jak zauważono w komentarzach -

Function.prototype.apply()Jest powolny! Poza tym nazywanie go, gdy masz określoną liczbę argumentów, jest bezcelowe…

warto było zrezygnować z używania Function.prototype.apply(), co daje zmienione wersje powyższych metod, po pierwsze bez opcji „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));

Demo JS Fiddle .

A z opcją „włącznie”:

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

Demo JS Fiddle .

Bibliografia:

David mówi, że przywróć Monikę
źródło
6
dlaczego używać apply zamiast dzwonić bezpośrednio jak Main.min(a,b)? Function.prototype.apply jest powolne! Poza tym nazywanie go, gdy masz określoną liczbę argumentów, jest bezcelowe.
Steel Brain
Dodam to do mojego domyślnego zestawu narzędzi - bardzo przydatne i dzięki za wkład!
SidOfc,
@SteelBrain: masz rację! Zaktualizowałem odpowiedź, aby to odzwierciedlić, chociaż podejrzewam, że miałem - początkowo - powód używania Function.prototype.apply(), ale nie mogę pomyśleć, co to było lub mogło być.
David mówi, że przywróć Monikę
6
DUŻO lepiej jest stworzyć funkcję, która nie modyfikuje Numberobiektu. Jest to anty-wzorzec, który przyjdzie i ugryzie Cię, jeśli standardy ECMA zmienią się w celu uwzględnienia Number.between()funkcji lub jeśli inna biblioteka lub inny fragment kodu definiuje Number.prototype.betweengdzie indziej z inną definicją. Zamiast tego utwórz funkcję pomocniczą i użyj jej!
Monarch Wadia
2
@MonarchWadia Chociaż twój punkt widzenia ma sens, że modyfikowanie / rozszerzanie obiektów natywnych jest złą praktyką, uważam, że to trochę zbędne, aby głosić to wszędzie (bez obrazy). Nie mogę policzyć, ile razy widziałem „nie modyfikuj obiektów natywnych”. Dla mnie to tak, jakby ktoś sprzedał noże domowe, ostrzegając kupującego o możliwych niebezpieczeństwach związanych z nożem za każdym razem, gdy sprzedaje taki nóż, tak jak odpowiedzialność sprzedawcy w przypadku jakichkolwiek szkód. Niebezpieczeństwa powinny być powszechnie znane. To od użytkownika powinno zależeć, czy je zignoruje, czy nie.
akinuri
80

Wolę umieścić zmienną wewnątrz, aby dać dodatkową wskazówkę, że kod sprawdza poprawność mojej zmiennej znajduje się między wartościami zakresu

if (500 < size && size < 600) { doStuff(); }
David
źródło
13
lubię ten styl! dostosuje to :)
Kaii
2
To moje preferencje, ponieważ jest bliżej min < testval < maxskładni Pythona
daveruinseverything
@GouravChawla, czy mówisz o przykładzie fragmentu kodu w tej odpowiedzi? Mój fragment kodu to Python, używany do porównania
daveruinseverything
@GouravChawla nikt nie powiedział inaczej. Nie jest jasne, z czym się nie zgadzasz.
daveruinseverything
28

To stare pytanie, ale może być przydatne dla kogoś takiego jak ja.

lodashma _.inRange()funkcję https://lodash.com/docs/4.17.4#inRange

Przykład:

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

Należy pamiętać, że ta metoda wykorzystuje Lodashbibliotekę narzędzi i wymaga dostępu do zainstalowanej wersji Lodash.

antongorodezkiy
źródło
2
Należy pamiętać, że nie uwzględniono wartości końcowej. na przykład. _.inRange(10, 0, 10) // => false
Lucio
Ponieważ OP ograniczył zakres pytania do Javascript, warto zauważyć, że ta metoda wykorzystuje Lodashbibliotekę narzędzi i wymaga dostępu do zainstalowanej wersji Lodash.
Chaya Cooper,
2

ifZamiast pisać można użyć klauzuli Multiple w warunku

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

ponieważ to naprawdę nie ma sensu logicznie, JavaScript odczyta twój warunek, taki jak

windowSize > -100 

ponieważ oblicza 500-600się-100

Powinieneś użyć &&na przykład do ścisłego sprawdzenia obu przypadków, które będą wyglądać tak

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

// Then doo something

}
Hanzla Habib
źródło
0

Właśnie zaimplementowałem ten fragment jQuery, aby pokazać i ukryć wartości modalne bootstrap. Różne pola są wyświetlane w zależności od zakresu wartości pola tekstowego użytkownika.

$(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();
                }
            }
    });
Mądry gość
źródło
6
Używanie jQuery do trywialnych funkcji było w 2013 roku być może opcją, ale dziś nie jest
mgamsjager
3
To prawda, ale obawiam się, że ludzie nadal będą go używać dzisiaj
mgamsjager
1
Z ciekawości: dlaczego jQuery jest teraz gorsze w użyciu dla trywialnych funkcji niż wtedy?
Julix,
2
@Julix to przede wszystkim wydajność, choć w tym przypadku znikoma. Ogólnym punktem byłoby „nie używaj jQuery, gdy nie jest to konieczne”, ale te komentarze nie są miejscem do (ponownego) rozpoczęcia debaty. baw się dobrze :) i.stack.imgur.com/sGhaO.gif
Luca
To tylko implementacja rozwiązania. OP ma już dostęp do wartości. Więc jQuery nie $().val()ma znaczenia i nie jest konieczne. Ale znowu, w pierwotnej wersji pytania, OP wspomina o jQuery, dla prostego sprawdzenia arytmetycznego. (wzdychanie) To pierwszy błąd.
akinuri
0

Oto najkrótsza możliwa metoda:

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

Sparametryzowane:

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

Możesz podzielić obie strony przez 2, jeśli nie rozumiesz, jak działa pierwsza;)

yukashima huksay
źródło