Как проверить, находится ли число между двумя значениями?

153

В JavaScript я говорю браузеру что-то сделать, если размер окна больше 500 пикселей. Я так делаю:

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

Это отлично работает, но я хотел бы применить тот же метод, но с диапазоном чисел. Поэтому я хотел бы сообщить своему браузеру, что нужно делать, если размер окна составляет от 500 до 600 пикселей. Я знаю, что это не сработает, но вот как я это себе представлял:

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

Возможно ли это вообще в JavaScript?

Дайк
источник
10
Кажется немного резковатым, чтобы закрыть этот вопрос. Могу я проголосовать за его повторное открытие. Он хорошо написан и дает пример кода.
Caltor
Безусловно, более правильной проверкой было бы if (windowsize> = 500 && windowsize <= 600) или if (! (Windowsize <500 || windowsize> 600))
SPlatten 03
Отвечает ли это на ваш вопрос? Проверить, находится ли значение в диапазоне чисел
betontalpfa

Ответы:

236

Проверяет, windowsizeявляется ли значение больше 500или меньше, чем 600означает, что ни одно из значений 500или 600само по себе не приведет к выполнению условия.

if (windowsize > 500 && windowsize < 600) {
  // ...
}
неопределенный
источник
1
спасибо undefined, просто чтобы подтвердить, что это будет делать то, что я хочу в браузере, когда размер окна больше 500 пикселей и меньше 600 пикселей, по сути, работает только в диапазоне 500-600 пикселей, правильно? (Я не очень хорошо разбираюсь в этом, смеется)
Дайк
1
@Dyck Да, это так :), обратите внимание, что jQuery - это всего лишь библиотека JavaScript.
undefined
7
Имейте в виду, что это условие верно только для windowsizeзначений от 501 до 599 пикселей. 500 пикселей и 600 пикселей исключены. Добавьте равенство к сравнениям, если вы хотите включить эти значения.
Роберт Коритник
4
Просто деталь, но более читабельна следующая:if(500 < windowsize && windowsize < 600)
Джованни Бенусси
Вау, это чудо!
Leap Hawk
123

У меня был момент, поэтому, хотя вы уже приняли ответ, я подумал, что внесу следующее:

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 .

Или, если вы предпочитаете иметь возможность проверять, находится ли число в заданном диапазоне, включая конечные точки :

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 .

Отредактировано, чтобы добавить небольшую поправку к вышеизложенному, учитывая, что - как отмечено в комментариях -

Function.prototype.apply()Медленно! Кроме того, что вызывать его при фиксированном количестве аргументов бессмысленно ...

стоило исключить использование Function.prototype.apply(), которое дает измененные версии вышеуказанных методов, во-первых, без опции '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));

Демо JS Fiddle .

И с опцией «включительно»:

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 .

Ссылки:

Дэвид просит восстановить Монику
источник
6
зачем использовать apply вместо прямого вызова like Main.min(a,b)? Function.prototype.apply работает медленно! Кроме того, вызывать его, когда у вас есть фиксированное количество аргументов, бессмысленно.
Steel Brain
Я собираюсь добавить это в свой набор инструментов по умолчанию - очень удобно и спасибо за этот вклад!
SidOfc
@SteelBrain: ты прав! Я обновил ответ, чтобы отразить это, хотя подозреваю, что изначально у меня была причина для использования Function.prototype.apply(), но я не могу понять, что это было или могло быть.
Дэвид просит восстановить Монику на работе
6
НАМНОГО лучше создать функцию, которая не изменяет Numberобъект. Это анти-шаблон, и он придет и укусит вас, если стандарты ECMA изменятся и включат Number.between()функцию, или если другая библиотека или другой фрагмент кода будут определены в Number.prototype.betweenдругом месте с другим определением. Вместо этого создайте вспомогательную функцию и используйте ее!
Монарх Вадиа
3
@MonarchWadia Хотя ваша точка зрения имеет смысл, что изменение / расширение собственных объектов - плохая практика, я считаю, что это немного излишне, если это проповедуется повсюду (без обид). Я не могу сосчитать, когда видел «не изменяйте собственные объекты». Для меня это похоже на то, что кто-то продает бытовые ножи, предупреждая покупателя о возможных опасностях ножа каждый раз, когда он / она продает нож, как будто продавец несет ответственность за любой ущерб. Опасности должны быть известны всем. Пользователь должен их игнорировать или нет.
akinuri
83

Я предпочитаю помещать переменную внутри, чтобы дать дополнительный намек на то, что код проверяет, что моя переменная находится между значениями диапазона

if (500 < size && size < 600) { doStuff(); }
Дэвид
источник
15
мне нравится этот стиль! адаптирую это :)
Kaii
3
Это мое предпочтение, так как он ближе к min < testval < maxсинтаксису Python
daveruinseverything
@GouravChawla, вы говорите о примере фрагмента кода в этом ответе? Мой фрагмент кода был Python, использовался для сравнения
daveruinseverything
@GouravChawla иначе никто не сказал. Непонятно, с чем вы не согласны.
daveruinseverything
28

Это старый вопрос, но он может быть полезен кому-то вроде меня.

lodashимеет _.inRange()функцию https://lodash.com/docs/4.17.4#inRange

Пример:

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

Обратите внимание, что этот метод использует Lodashслужебную библиотеку и требует доступа к установленной версии Lodash.

антонгородезский
источник
2
Имейте в виду, что конечное значение не включено. например. _.inRange(10, 0, 10) // => false
Lucio
Поскольку OP ограничил объем вопроса Javascript, стоит отметить, что этот метод использует Lodashслужебную библиотеку и требует доступа к установленной версии Lodash.
Chaya Cooper
2

Вы можете использовать предложение Multiple в ifусловии вместо записи

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

потому что логически это не имеет смысла, JavaScript прочитает ваше условие if, например

windowSize > -100 

потому что он рассчитывает 500-600на-100

Вы должны использовать &&для строгой проверки оба случая, например, которые будут выглядеть так

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

// Then doo something

}
Ханзла Хабиб
источник
0

Я только что реализовал этот бит jQuery, чтобы показывать и скрывать модальные значения начальной загрузки. Различные поля отображаются в зависимости от диапазона значений записи текстового поля пользователя.

$(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();
                }
            }
    });
Мудрый парень
источник
7
Использование jQuery для тривиальных функций было возможным в 2013 году, но не сегодня
mgamsjager
3
Верно, но я боюсь, что люди все еще будут использовать его сегодня
mgamsjager
1
Из любопытства: почему jQuery сейчас хуже использовать для тривиальных функций, чем тогда?
Julix
2
@Julix в основном производительность, хотя и незначительная в данном случае. Общим правилом было бы «не используйте jQuery, если в этом нет необходимости», но эти комментарии не место для (повторного) начала дискуссии. получайте удовольствие от этого :) i.stack.imgur.com/sGhaO.gif
Лука
Это просто реализация решения. OP уже имеет доступ к значениям. Так что jQuery не $().val()имеет значения и не нужен. Но опять же, в исходной версии вопроса OP упоминает jQuery для простой арифметической проверки. (вздох) Это первая ошибка.
акинури
0

Вот самый короткий из возможных способов:

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

Параметризовано:

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

Вы можете разделить обе стороны на 2, если не понимаете, как работает первая;)

Юкашима Хуксай
источник