2015-06-22 3 views
9
if (Progress.bar.status == 'finished' || Progress.bar.status == 'uploading'){ 
    //code here 
} 

Как это сократить? Я хотел бы написать это, не повторяя дважды Progress.bar.status.Ярлык для сравнения, если заявления

Что-то вдоль линий:

Progress.bar.status == ('finished' or 'uploading'). 
+1

'Progress.bar.status? ('finished' || 'uploading'): «something else» –

+0

Каковы другие возможные значения? –

+0

@SwarajGiri, это не работает, потому что любая непустая строка возвращает true и возвращает '' finished ''. но требование «// code здесь» не реализуется (не может быть). –

ответ

16

Мне нравится справочные таблицы:

if ({finished:1, uploading:1}[Progress.bar.status]){ 
    //code here 
} 

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

Обратите внимание, что в некоторых случаях вы можете использовать Object.create(null), а затем слияние/расширение этого пустого объекта с вашими параметрами, если вы абсолютно должны избегать ложных срабатываний для «hasOwnProperty», «valueOf», «toString», «toLocaleString», «конструктор» и нескольких расширений с двойным подчеркиванием. это не часто проблема, но это то, что нужно иметь в виду. если вы можете жить без подачи своих ключевых слов или создания кэшированной коллекции из Object.create(), это быстрый и простой способ кодирования «одного из вышеперечисленных» потоков.

+0

Ницца, не знал об этом. – hsz

+0

Почему вы добавляете _1_ в ** {закончен: 1, выгрузка: 1} **? –

+1

'1' - это значение, которое будет удовлетворять' if ('когда ключ совпадает, и быстро набирается. Любое значение thruthy будет делать, но для многих прогов' 1' означает yes и '0' означает no .. – dandavis

4

сделать с пожелавшими строк массива, применить поиск индекса массива. Результат равен -1 для не найденного и 0 ... n для найденной строки. чтобы сделать этот короткий и в то время как нам нужно только 0 ... N результат, применить побитовое не к результату (https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_NOT) :

value ~value boolean 
-1 => 0 => false 
    0 => -1 => true 
    1 => -2 => true 
    2 => -3 => true 
    and so on 

В коде все вместе это выглядит следующим образом:

if (~['finished', 'uploading'].indexOf(Progress.bar.status)) { 
    // code here 
} 
+0

не можете ли вы его объяснить – ozil

+0

@ozil, сюда пойдем. –

4

я могу предложить работать с перечислениями, то есть switch() заявления:

var Status = { 
    Finished: 'finished', 
    Uploading: 'uploading' 
}; 

switch (Progress.bar.status) { 
    case Status.Finished: 
    case Status.Uploading: 
     //code here 
     break; 
} 

Больше кода на начальном этапе, но более гибкий и читаемый.

0

Я знаю, что расширение родной объект является табу, но:

String.prototype.eqOr = function(){ 
    var i; 
    var str = this.toString(); 
    for(i=0; i< arguments.length; i++){ 
    if(arguments[i] === str){ 
     return true; 
    } 
    } 
    return false; 
} 

if(Progress.bar.status.eqOr('finished', 'uploading')){ 
    //code here 
} 

v2.0, благодаря JACK

String.prototype.eqOr = function(){ 
    return [].indexOf.call(arguments, this.toString()) !== -1; 
} 
+0

'return [] .indexOf.call (arguments, this)! == -1;' :) –

+0

или испечь вынос: 'isOk = []. IndexOf.bind (['finished', 'uploading']); ' – dandavis

Смежные вопросы