поэтому я хочу использовать оператор switch следующим образом:
switch (scrollLeft) {
case (<1000):
//do stuff
break;
case (>1000 && <2000):
//do stuff
break;
}
Теперь я знаю, что любое из этих утверждений ( <1000
) или ( >1000 && <2000
) не будет работать (очевидно, по разным причинам). То, что я спрашиваю, является наиболее эффективным способом сделать это. Я ненавижу использовать 30 if
операторов, поэтому я бы предпочел использовать синтаксис переключателя. Есть ли что-нибудь, что я могу сделать?
your_mapper_object[scrollLeft / SOME_CONST]
, предполагая, что-your_mapper_object
то вроде{1: some_func, 2: another_func, ...}
. И в этом случае вы также можете использовать переключатель.Ответы:
Когда я посмотрел на решения в других ответах, я увидел некоторые вещи, которые, как я знаю, плохо влияют на производительность. Я собирался поместить их в комментарий, но я подумал, что было бы лучше сравнить его и поделиться результатами. Вы можете проверить это сами . Ниже приведены мои результаты (ymmv), нормализованные после самой быстрой операции в каждом браузере (умножьте 1,0 раз на нормализованное значение, чтобы получить абсолютное время в мс).
Тест проводился в Windows 7 32bit с следующими версиями: Chrome 21.0.1180.89m , Firefox 15.0 , Opera 12.02 , MSIE 9.0.8112 , Safari 5.1.7 . Узел был запущен на 64-битной системе Linux, поскольку разрешение таймера в Node.js для Windows составляло 10 мс, а не 1 мс.
если немедленное
Это самая быстрая во всех протестированных средах, за исключением ... барабанной дроби MSIE! (Сюрприз Сюрприз). Это рекомендуемый способ его реализации.
если косвенный
Это вариант,
switch-indirect-array
но сif
вместо -statements и работает намного быстрее, чемswitch-indirect-array
почти во всех протестированных средах.включение немедленное
Это довольно быстро во всех протестированных средах и на самом деле самый быстрый в MSIE. Это работает, когда вы можете сделать расчет, чтобы получить индекс.
автоматическое включение фар
Это примерно в 6-40 раз медленнее, чем самая быстрая во всех протестированных средах, за исключением Opera, где она занимает примерно полтора раза. Это медленно, потому что двигатель должен сравнить значение дважды для каждого случая. Удивительно, но для выполнения этого Chrome требуется почти 40 раз больше времени по сравнению с самой быстрой операцией в Chrome, а MSIE - всего в 6 раз дольше. Но фактическая разница во времени составляла только 74 мс в пользу MSIE при 1337 мс (!).
включение range2
Это вариант,
switch-range
но с одним сравнением в каждом случае, поэтому он быстрее, но все еще очень медленный, за исключением Opera. Порядок оператора case важен, так как механизм будет проверять каждый случай в порядке исходного кода. ECMAScript262: 5 12.11включение косвенного массива
В этом варианте диапазоны хранятся в массиве. Это медленно во всех протестированных средах и очень медленно в Chrome.
массив линейного поиска
Это комбинация линейного поиска значений в массиве и оператора switch с фиксированными значениями. Причина, по которой можно использовать это, заключается в том, что значения неизвестны до времени выполнения. Он медленный в каждой тестируемой среде и занимает почти в 10 раз больше времени в MSIE.
Массив-двоично-переключатель
Это вариант,
array-linear-switch
но с бинарным поиском. К сожалению, это медленнее, чем линейный поиск. Я не знаю, является ли это моей реализацией или линейный поиск более оптимизирован. Возможно также, что пространство клавиш слишком маленькое.Вывод
Если важна производительность, используйте
if
-statements илиswitch
с непосредственными значениями.источник
Альтернатива:
Демо: http://jsfiddle.net/UWYzr/
источник
if(...) else if(...)
? Это избегает,if
но не совсем похоже на замену мне.if
-statements. Смотрите мой ответ здесьРаботает только если у вас есть регулярные шаги ...
РЕДАКТИРОВАТЬ: так как это решение продолжает получать голоса, я должен сказать, что решение Mofolo лучше
источник
Math.round(scrollLeft/1000)
кстати.Вы можете создать пользовательский объект с критериями и функцией, соответствующей критериям
Определите функции для того, что вы хотите сделать в этих случаях (определите function1, function2 и т. Д.)
И "оценить" правила
Заметка
Много раз, если заявления легче читать и поддерживать. Я бы порекомендовал вышеупомянутое только тогда, когда у вас много условий и возможность большого роста в будущем.
Обновление
Как @Brad указывал в комментариях, если условия являются взаимоисключающими (только одно из них может быть истинным одновременно), проверки верхнего предела должно быть достаточно:
при условии, что условия определены в порядке возрастания (сначала самый низкий
0 to 1000
, а затем,1000 to 2000
например,)источник
action=function1
- разве это не должны быть двоеточия? ;-) - Вы также можете изменить его, чтобы иметь только верхний предел, так как из-за процесса исключения вы не можете попасть в две группы - если только это не было вашим намерением (иметь несколько возможных действий).Что именно вы делаете в
//do stuff
?Вы можете сделать что-то вроде:
источник
Непроверенный и неуверенный, будет ли это работать, но почему бы не сделать несколько
if statements
ранее, чтобы установить переменные дляswitch statement
.источник
Это еще один вариант:
источник
Обновление принятого ответа (пока не могу комментировать). Начиная с 1/12/16 с использованием демонстрационной версии jsfiddle в Chrome, Switch-немедленное является самым быстрым решением.
Результаты: Разрешение по времени: 1,33
Законченный
источник
В моем случае (цветовое кодирование в процентах, ничего не критично к производительности) я быстро написал следующее:
источник
У меня была такая же ситуация в последнее время, вот как я ее решил:
перед:
после:
А если вы установите «1, 2, 3, 4, 5», то это может быть еще проще:
источник