Come verificare se un numero è compreso tra due valori?


144

In JavaScript, sto dicendo al browser di fare qualcosa se la dimensione della finestra è superiore a 500 px. Lo faccio così:

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

Funziona benissimo, ma vorrei applicare questo stesso metodo, ma con un intervallo di numeri. Quindi vorrei dire al mio browser di fare cose se la dimensione della finestra è compresa tra 500 e 600 pixel. So che non funzionerebbe, ma ecco come l'ho immaginato:

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

È anche possibile, all'interno di JavaScript?


9
Sembra un po 'difficile chiudere questa domanda. Posso votare per riaprirlo. È ben scritto e fornisce un codice di esempio.
Caltor,

Sicuramente il controllo più corretto sarebbe se (windowsize> = 500 && windowsize <= 600) o if (! (Windowsize <500 || windowsize> 600))
SPlatten,

Risposte:


225

Verifica se windowsizeè maggiore 500e minore del 600significato che né i valori 500600se stessi daranno luogo alla condizione.

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

1
grazie indefinito, solo per confermare ciò farà quello che voglio all'interno del browser quando la dimensione della finestra è superiore a 500 px e inferiore a 600 px, funzionante essenzialmente nell'intervallo di 500-600 px, giusto? (Non sono troppo bravo con questa roba lol)
Dyck,

1
@Dyck Sì, lo fa :), nota che jQuery è solo una libreria JavaScript.
non definito il

7
windowsizeTieni presente che questa condizione è vera solo quando è almeno 501 px e al massimo 599 px. 500px e 600px sono esclusi. Aggiungi uguaglianza ai confronti se vuoi includere questi valori.
Robert Koritnik,

3
Solo un dettaglio, ma è più leggibile nel modo seguente:if(500 < windowsize && windowsize < 600)
Giovanni Benussi,

119

Ho avuto un momento, quindi, anche se hai già accettato una risposta, ho pensato di contribuire con il seguente:

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 di JS Fiddle .

Oppure, se si preferisce avere la possibilità di verificare che un numero sia compreso nell'intervallo definito, inclusi gli end-point :

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 di JS Fiddle .

Modificato per aggiungere un emendamento minore a quanto sopra, dato che - come notato nei commenti -

... Function.prototype.apply()è lento! Oltre a chiamarlo quando hai un numero fisso di argomenti è inutile ...

valeva la pena rimuovere l'uso di Function.prototype.apply(), che produce le versioni modificate dei metodi di cui sopra, in primo luogo senza l'opzione "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));

Demo di JS Fiddle .

E con l'opzione "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));

Demo di JS Fiddle .

Riferimenti:


6
perché usare si applica invece di chiamare direttamente come Main.min(a,b)? Function.prototype.apply è lento! Oltre a chiamarlo quando hai un numero fisso di argomenti è inutile.
Steel Brain,

Lo aggiungerò al mio toolbox predefinito: molto utile e grazie per questo contributo!
SidOfc,

@SteelBrain: hai ragione! Ho aggiornato la risposta per riflettere ciò, anche se sospetto di avere - inizialmente - un motivo per utilizzarlo Function.prototype.apply(), ma non riesco a pensare a cosa fosse, o avrebbe potuto essere.
David dice di ripristinare Monica il

6
è MOLTO meglio creare una funzione che non modifica l' Numberoggetto. Questo è un anti-schema e verrà e ti morderà se gli standard ECMA cambiano per includere una Number.between()funzione, o se un'altra libreria o un altro pezzo di codice definisce Number.prototype.betweenaltrove con una diversa definizione. Invece, crea una funzione di supporto e usala!
Monarch Wadia,

2
@MonarchWadia Mentre il tuo punto ha senso che modificare / estendere gli oggetti nativi è una cattiva pratica, penso che sia un po 'ridondante avere questo predicato ovunque (senza offesa). Non posso contare le volte che ho visto "non modificare oggetti nativi". Per me, è come se qualcuno vendesse coltelli domestici avvertendo l'acquirente dei possibili pericoli del coltello ogni volta che ne vende uno come sua responsabilità del venditore in caso di danni. I pericoli dovrebbero essere conoscenza comune. Dovrebbe spettare all'utente se li ignora o meno.
akinuri,

80

Preferisco mettere la variabile all'interno per dare un ulteriore suggerimento che il codice sta convalidando la mia variabile è tra i valori di un intervallo

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

13
mi piace questo stile! lo
adatterò

2
Questa è la mia preferenza, poiché è più vicina alla min < testval < maxsintassi di Python
daveruinseverything il

@GouravChawla stai parlando dell'esempio dello snippet di codice in questa risposta? Il mio frammento di codice era Python, usato per il confronto
daveruinseverything

@GouravChawla nessuno ha detto diversamente. Non è chiaro con cosa tu non sia d'accordo.
daveruinseverything

28

È una vecchia domanda, tuttavia potrebbe essere utile per qualcuno come me.

lodashha la _.inRange()funzione https://lodash.com/docs/4.17.4#inRange

Esempio:

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

Questo metodo utilizza la Lodashlibreria di utilità e richiede l'accesso a una versione installata di Lodash.


2
Si noti che il valore finale non è incluso. per esempio. _.inRange(10, 0, 10) // => false
Lucio

Poiché l'OP ha limitato l'ambito della domanda a Javascript, vale la pena notare che questo metodo utilizza la Lodashlibreria di utilità e richiede l'accesso a una versione installata di Lodash.
Chaya Cooper,

2

È possibile utilizzare la clausola Multiple nella ifcondizione anziché scrivere

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

perché questo non ha davvero senso logicamente JavaScript leggerà la tua condizione if

windowSize > -100 

perché calcola 500-600a-100

Dovresti usare &&per un controllo rigoroso entrambi i casi, ad esempio, che sarà simile a questo

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

// Then doo something

}

0

Ho appena implementato questo bit di jQuery per mostrare e nascondere i valori modali del bootstrap. Diversi campi vengono visualizzati in base all'intervallo di valori di una voce della casella di testo degli utenti.

$(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'uso di jQuery per funzioni banali era nel 2013 forse un'opzione, ma non lo è oggi
mgamsjager,

3
Vero, ma temo che le persone lo useranno ancora oggi
mgamsjager,

1
Per curiosità: perché jQuery è peggio da usare per le funzioni banali di allora?
Julix,

2
@Julix per lo più prestazioni, anche se trascurabili in questo caso. Il punto generale sarebbe "non usare jQuery quando non è necessario", ma questi commenti non sono il luogo per (ri) avviare il dibattito. divertiti con questo :) i.stack.imgur.com/sGhaO.gif
Luca,

Questa è solo un'implementazione della soluzione. OP ha già accesso ai valori. Quindi jQuery $().val()è irrilevante e non necessario. Ma ancora una volta, nella versione originale della domanda, OP menziona jQuery, per un semplice controllo aritmetico. (sospiro) Questo è il primo errore.
akinuri,

0

Ecco il metodo più breve possibile:

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

parametrizzata:

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

Puoi dividere entrambi i lati per 2 se non capisci come funziona il primo;)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.