2015-08-08 6 views
0

Я хочу вызвать разные функции в зависимости от ввода, который я нахожу. Если вход соответствует одной из клавиш, я хочу, чтобы вызвать соответствующую функцию - с некоторыми параметрами:Javascript: function as hash value

var commands = { 
    'key1': someFunction, 
    'key2': otherFunction 
}; 

Клавиши строки и сделать его проще, я создал command_keys переменную:

var command_keys = Object.keys(commands); 

Я определяю две функции дальше:

function someFunction(param) { 
// do sth. 
}; 

function otherFunction(param) { 
// do sth. else 
}; 

Тогда я проверить состояние ключа и вызова одной из функций в зависимости от того, какой ключ я нашел:

if (command_keys.indexOf(some_string) > -1) { 
    index = command_keys.indexOf(some_string); 
    commands[index](some_param); 
} 

Однако я получаю сообщение об ошибке:

Uncaught TypeError: commands[index] is not a function(anonymous function) 

Спасибо за ваши идеи.

+0

Что такое 'some_array'? Было бы лучше, если бы вы показали нам полный сценарий. –

+2

Итак, если 'command_keys' является массивом, то' index' является целым числом, а 'commands' не имеет целочисленных ключей. – zerkms

+0

@zerkms command_keys - это только ключи команд, например. Object.keys (команды); Я добавил это к вопросам. Правильно, клавиши команд - это строки, а some_array - это массив строк. – Randomtheories

ответ

3

Я не думаю, что вам нужно command_keys. commands будет достаточно для того, что вы здесь описываете.

var commands = { 
    'key1': someFunction, 
    'key2': otherFunction 
}; 

var command = commands[some_string]; 
if (typeof command === 'function') { 
    command(some_param); 
} 
+0

Что делать, если 'command_keys' является своего рода фильтром применимых команд в данном контексте? Например, у нас есть команда «edit», но мы не можем ее выполнять, когда что-то находится в режиме «только для чтения». – zerkms

+0

Хорошо, тогда вы можете сохранить его и добавить еще одно условие: if 'typeof command === 'function' && command_keys.indexOf (some_string)! == -1'. Однако 'command_keys' по-прежнему не полезен для получения фактической команды из' команд' на основе 'some_string'. –

+0

Правильно. Мое мнение состояло в том, что вы не можете поставить оператор «Я не думаю, что вам нужны команды command_keys at all», если не указана более подробная информация. PS: О, я просто заметил 'var command_keys = Object.keys (commands);', так что кажется правильным, что это действительно избыточно. – zerkms