2010-02-21 2 views
19

Я не хочу использовать коммутатор в моем коде, так что я ищу какой-то альтернативнойАльтернатива «переключатель» Заявление

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

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. Это лучшее решение?
+6

Это здорово. Оставь это. – codeholic

+2

да, это лучшее решение с меньшим кодом :) – Sarfraz

+0

Это был бы маршрут, по которому я поеду. – brian

ответ

19

У меня есть только примечание о вашем втором подходе вы shouldn't use an 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 
    // ... 
} 
+0

С уважением, я думаю, что статья, которую вы связали, ошибалась. Скорее, не следует использовать for..in для итерации массива. –

+1

@machine: В этой статье также говорится о 'for ... in' заявлении и проблемах, которые возникают, когда элемент прототипа встроенных конструкторов, таких как' Array' и 'Object', расширен, но нижняя строка статьи заключается в том, что * JavaScript-массивы предназначены для численного *, и они часто используются для хранения произвольных пар ключ/значение, что является плохой практикой ... – CMS

+0

Итог? Использование свойств expando в массиве не изменяет этот факт. Вам нечего выиграть, превратив один из самых универсальных объектов в ваше распоряжение в наименее универсальный. Я не уверен, почему вы говорите: «В статье также говорится» ... Я понимаю, что весь смысл статьи заключается в том, чтобы «лучше» поддерживать использование for..in с массивами. –

0

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

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

0

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

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

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

+0

Отличная идея! Спасибо. – Bambert

+2

Это работает только для этого конкретного примера, скорее всего, у них нет такого общего в реальности. Также цвета здесь глобальны, что редко бывает хорошим. – falstro

+0

Я отредактирую ответ, чтобы сделать это более очевидным. – smaclell

1

Вопрос 2:

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

0

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

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

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

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

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

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

короткий и простой, нравится. +1 – schellmax

+0

это круто, пока выбранный цвет существует в colorString. если selectedColor является «оранжевым», например, вы получите Type Error. – northamerican

+1

На самом деле вы можете легко добавить опцию по умолчанию с '({'red': 'цвет красный'}) [selectedColor] || 'default'' – superzamp

1

Я должен был сделать этого сравнить для группы рода объектов реквизита для списка и не хотите, чтобы сделать переключатель/случай для всех возможности, поэтому я сначала сделал массив объектов, присваивающих числовому рангу, чтобы случай стал простым сравнением. Это только 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; 

}

+0

Его ответ: альтернатива использованию переключателя/футляра для этой цели. Вы также можете использовать [] из [] для получения фактической матрицы возвращаемых значений. – Icedvolvo

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