Подтвердить что ты не робот

Альтернатива заявлению "switch"

Я не хочу использовать 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]();

}

Мои вопросы:

  • Знаете ли вы другие альтернативы?
  • Это лучшее решение?
4b9b3361

Ответ 1

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

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

Кроме того, вы можете проверить, существует ли аргумент 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
  // ...
}

Ответ 2

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

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.');

Ответ 3

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

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');

Ответ 4

Вопрос 2:

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

Ответ 5

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

function 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;

}

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

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

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