Как можно связать ключевое слово с функцией?

199
20 марта 2018, 03:03

Имеется массив состоящий из ключевых слов["left", "right", "top", "bottom"]

Имеются функции которые должны быть связаны с данными элементами массива.

Например:

function flipLeft () { /* some code */ } function flipBottom () { /* some code */ }

И так далее.

Предполагается что эти функции будут вызываться последовательно согласно тому как они размещены в массиве, к слову, в массиве ключевые слова могут быть в произвольном порядке:

["right", "left", "bottom", "top"]

Вопрос в следующем, каким образом можно связать эти ключевые слова с конкретными функциями ?

Например: left => flipLeft()

Другими словами если передано left вызвать flipLeft() и аналогично с другими функциями.

P.S У меня есть решение но оно не совсем мне подходит, хотелось бы посмотреть другие варианты. Спасибо

Answer 1

Можно через объявление внутри свойств и вызов их.

var obj = { 
  left: function flipLeft() { 
    console.log("flipLeft"); 
  }, 
  right: function flipRight() { 
    console.log("flipRight"); 
  }, 
   bottom: function flipBottom() { 
    console.log("flipBottom"); 
  }, 
  top:function fliptop() { 
    console.log("fliptop"); 
  }, 
}; 
 
for(var key in obj){ 
  obj[key](); 
}

Answer 2

Можно с помощью eval, но лично я бы сделал просто switch/case, где ключ каждого кейса это название функции, а тело - это вызов нужной.

switch(funcName)
{
    case "right":
       flipRight();
    break;
    case "left":
        flipLeft();
    break;
    default:
    break;
}

UPDATE

Кстати, автоматический вызов функции через eval или другое что-то похожее - это зло! (мое мнение конечно). Замечательный способ выстрелить себе в ногу нечаянно расслабившись :)) Так что свич или подобный механизм - самое то! Только не забудте прописать кейс по умолчанию (default) от греха подальше.

Answer 3

let arr = ["left", "right", "top", "bottom", "left", "right"]; 
 
let funcMap = { 
  left: flipLeft, 
  right: flipRight, 
  top: flipTop, 
  bottom: flipBottom 
}; 
 
function flipLeft() { 
  console.log('←') 
} 
 
function flipBottom() { 
  console.log('↓') 
} 
 
function flipRight() { 
  console.log('→') 
} 
 
function flipTop() { 
  console.log('↑') 
} 
 
arr.forEach(item => funcMap[item]());

Answer 4

Как вариант вызывать функции через window, и чтобы избежать лишней награможденности кода, можно изменить элементы массива, чтобы они начинались с большой буквы, если это возможно.

let array = ["left", "right", "top", "bottom"]; 
 
for (let item of array) { 
  runFunction(item); 
} 
 
function runFunction(element) { 
  window['flip' + element.charAt(0).toUpperCase() + element.slice(1)](); 
  //window['flip'+element](); //можно записать так, если элементы в массиве будут с большой буквы 
} 
 
function flipLeft() { 
  alert('left'); 
}; 
 
function flipBottom() { 
  alert('Bottom'); 
}; 
 
function flipTop() { 
  alert('Top'); 
}; 
 
function flipRight() { 
  alert('right'); 
};

Answer 5
function firstFunc () { ... }
function secondFunc () { ... }
function thirdFunc () { ... }
['first', 'third', 'second', 'first'].forEach(funcName => eval(`${funcName}Func()`))
READ ALSO
SQL запрос под joomla 3.x

SQL запрос под joomla 3.x

Есть запрос который отрабатывает успешно

206
Привести данные с MySQL для графиков Google Charts

Привести данные с MySQL для графиков Google Charts

Для дальнейшего подключения Google Charts необходимо, чтобы выходные данные имели вид

228
Как настроить сортировку в modx

Как настроить сортировку в modx

ЗдравствуйтеНеобходимо на сайте сделать сортировку по произвольному полю и дате добавления одновременно

220