Як перевірити, чи число між двома значеннями?


144

У JavaScript я кажу браузеру щось робити, якщо розмір вікна перевищує 500 пікселів. Я це роблю так:

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

Це чудово працює, але я хотів би застосувати цей самий метод, але з діапазоном чисел. Тому я хотів би сказати своєму браузеру робити речі, якщо розмір вікна становить від 500 до 600 пікс. Я знаю, що це не спрацювало б, але ось як я це уявив:

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

Це можливо навіть в JavaScript?


9
Здається трохи суворо, щоб закрити це питання. Чи можу я проголосувати за його повторне відкриття. Він добре написаний і дає зразок коду.
Caltor

Безумовно, правильнішою буде перевірка, якщо (windowsize> = 500 && windowsize <= 600) або якщо (! (Windowsize <500 ||
windowsize

Відповіді:


225

Тестує, чи windowsizeбільше, 500і менше, ніж 600означає, що ні значення, 500ні 600самі по собі не призведуть до того, що умова стане істинною.

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

1
дякую не визначено, просто щоб підтвердити це, я зроблю те, що хочу в браузері, коли розмір вікна перевищує 500 пікселів і менше 600 пікс. По суті, функціонує лише в межах 500-600px, правильно? (Я не надто хороший з цим матеріалом, хаха)
Дік

1
@Dyck Так, це так :), зауважте, що jQuery - це лише бібліотека JavaScript.
визначено

7
Зауважте, що ця умова справедлива лише тоді, коли windowsizeвона становить принаймні 501 пікселів і не більше 599 пікс. 500px та 600px виключені. Додайте рівність для порівнянь, якщо ви хочете включити ці значення.
Роберт Коритник

3
Просто деталь, але читається наступним чином:if(500 < windowsize && windowsize < 600)
Джованні Бенуссі

119

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

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(), що дає змінені версії вищезазначених методів, по-перше, без опції "включення":

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
чому використання застосувати, а не дзвонити безпосередньо так Main.min(a,b)? Function.prototype.apply повільно! Крім того, називати його, коли у вас є фіксована кількість аргументів, безглуздо.
Сталевий мозок

Я збираюся додати це до своєї панелі інструментів за замовчуванням - дуже зручно і дякую за цей внесок!
SidOfc

@SteelBrain: у вас є пункт! Я оновив відповідь, щоб відобразити це, хоч і підозрюю, що мав - спочатку - причину використання Function.prototype.apply(), але не можу подумати, що це було чи могло бути.
Девід каже відновити Моніку

6
МНОГО краще створити функцію, яка не змінює Numberоб'єкт. Це анти-шаблон і з’явиться, і покусить вас, якщо стандарти ECMA зміняться на Number.between()функцію, або якщо інша бібліотека чи інший фрагмент коду визначені в Number.prototype.betweenінших місцях з іншим визначенням. Замість цього зробіть функцію помічника і використовуйте це!
Монарх Вадія

2
@MonarchWadia Хоча ваша думка має сенс, що змінювати / розширювати рідні об’єкти - це погана практика, я вважаю, що це дещо зайве, коли це проповідується скрізь (без образи). Я не можу порахувати кількість разів, які я бачив, "не змінюйте рідні об'єкти". Для мене це схоже на те, що хтось продає побутові ножі, попереджаючи покупця про можливі небезпеки ножа щоразу, коли він / вона продає такий, як його відповідальність продавця, якщо є якась шкода. Небезпеки повинні бути загальновідомими. Користувач повинен залежати, якщо він / вона їх ігнорує чи ні.
акінурі

80

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

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

13
мені подобається цей стиль! пристосуємо це :)
Kaii

2
Це моє уподобання, оскільки це ближче до 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

Оскільки ОП обмежило сферу питання Javascript, варто зазначити, що цей метод використовує Lodashбібліотеку утиліт та вимагає доступу до встановленої версії Lodash.
Чая Купер

2

Ви можете використовувати декілька пропозицій в ifумові, а не писати

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

тому що це справді не має сенсу, логічно JavaScript прочитає ваш стан, якщо така умова подобається

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

6
Використання jQuery для тривіальних функцій було в 2013 році, можливо, варіантом, але це не сьогодні
mgamsjager

3
Щоправда, але я боюся, що люди все ще будуть використовувати це сьогодні
mgamsjager

1
З цікавості: чому зараз jQuery гірше використовувати для тривіальних функцій, ніж тоді?
Джулікс

2
@Julix в основному продуктивність, хоча і незначна в цьому випадку. Загальним моментом буде "не використовувати jQuery, коли це не потрібно", але ці коментарі не є місцем для (повторного) початку дискусії. весело з цим хоч :) i.stack.imgur.com/sGhaO.gif
Лука

Це лише реалізація рішення. ОП вже має доступ до значень. Тож jQuery $().val()не має значення та не є необхідним. Але знову ж таки, в оригінальній версії запитання ОП згадує 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, якщо ви не розумієте, як працює перша;)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.