Альтернатива «переключателю» - PullRequest
19 голосов
/ 21 февраля 2010

Я не хочу использовать Switch в моем коде, поэтому я ищу альтернативу

Пример с переключателем:

function write(what) {

  switch(what) {

    case 'Blue':
      alert ('Blue');
    break;

    ...

    case 'Red':
      alert ('Red');
    break;

  }

}

Пример без переключателя:

colors = [];

colors['Blue'] = function() { alert('Blue'); };
colors['Red'] = function() { alert('Red'); };


function write(what) {

  colors[what]();

}

Мои вопросы:

  1. Знаете ли вы другие альтернативы?
  2. Это лучшее решение?

Ответы [ 8 ]

20 голосов
/ 21 февраля 2010

У меня есть только примечание о вашем втором подходе, вы не должны использовать массив для хранения нечисловых индексов (который вы бы назвали на других языках ассоциативный массив ) .

Вы должны использовать простой объект.

Кроме того, вы можете проверить, существует ли аргумент what, переданный вашей функции write, как свойство вашего объекта colors, и посмотреть, является ли она функцией, поэтому вы можете вызывать ее, не имея времени выполнения. ошибки:

var colors = {};

colors['Blue'] = function() { alert('Blue'); };
colors['Red'] = function() { alert('Red'); };


function write(what) {
  if (typeof colors[what] == 'function') {
    colors[what]();
    return;
  }
  // not a function, default case
  // ...
}
5 голосов
/ 15 февраля 2012

Сегодня я использовал такую ​​структуру:

var chosenColor = 'red';

var colorString = {
    'red': 'The color is red.',
    'green': 'The color is green.',
    'blue': 'The color is blue.',
}[chosenColor] || 'The color is unknown.';

Мне нравится, что это действительно небольшой объем кода для выбора строки на основе выбора.

Вы также можете передать его в функцию:

alert({
    'red': 'The color is red.',
    'green': 'The color is green.',
    'blue': 'The color is blue.',
}[chosenColor] || 'The color is unknown.');
2 голосов
/ 15 января 2011

Вы можете использовать литералы объектов и попробовать перехватить ловушку по умолчанию:

function write(what) {
    var colors = {
    'Blue': function(){ alert('Light-Blue'); },
    'Red': function(){ alert('Deep-Red'); },
    'Green': function(){ alert('Deep-Green'); }
    }
    try {colors[what]();}
    catch(err) {colors['Green']();}//default behaviour
}
write('Pink');
1 голос
/ 09 сентября 2014

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

функция mySort2 (item1, item2) {

     var matrix = {  
    'repair': 4,  
    'r/r': 3,  
    'part': 2,  
    'misc': 1  
  };  

(matrix[item1.category] < matrix[item2.category]) ? return +1 : return -1;

// если возможно, для этого нужно сначала проверить плохие данные ???

i1=matrix[item1.category] || null;
i2=matrix[item2.category] || null;

if (i1==null){
    // handle bad data in item 1
    return +1; // put it after 2
}

if (i2==null){
    // ditto 
    return -1; //put 1 first
}

if (i1<i2) 
    return +1;
else 
    return -1;

}

1 голос
/ 21 февраля 2010

Вопрос 2:

Как правило, если вы можете заменить пользовательские структуры управления поиском по словарю, у вас все отлично. Это легко читать и очень элегантно - придерживайтесь его.

0 голосов
/ 21 февраля 2010

Как я уже сказал, это здорово. Единственное, что я могу добавить к вашему решению, это то, что, возможно, лучше локализовать ваш colors.

function write(what) {
    var colors = [];
    colors['Blue'] = function() { alert('Blue'); };
    colors['Red'] = function() { alert('Red'); };
    colors[what]();
}
0 голосов
/ 21 февраля 2010

Вы уже почти там. Если возможно, вы можете добавить вспомогательную функцию, чтобы упростить настройку. Например:

function setup(what)
{
    colors[what] = function() { alert(what); };
}

EDIT:
Если то, что вы хотите сделать для каждого варианта, более очевидно, это не сработает. Как уже упоминалось в комментариях @roe, здесь используются глобальные цвета, которые часто осуждаются.

0 голосов
/ 21 февраля 2010

Альтернативой является определение класса с помощью метода write и его переопределение в подклассах Red и Blue для правильной работы.

Лучше ли это, чем предложенное вами решение, зависит от вашей конкретной ситуации.

...