Имеется массив состоящий из ключевых слов["left", "right", "top", "bottom"]
Имеются функции которые должны быть связаны с данными элементами массива.
Например:
function flipLeft () { /* some code */ }
function flipBottom () { /* some code */ }
И так далее.
Предполагается что эти функции будут вызываться последовательно согласно тому как они размещены в массиве, к слову, в массиве ключевые слова могут быть в произвольном порядке:
["right", "left", "bottom", "top"]
Вопрос в следующем, каким образом можно связать эти ключевые слова с конкретными функциями ?
Например: left => flipLeft()
Другими словами если передано left вызвать flipLeft() и аналогично с другими функциями.
P.S У меня есть решение но оно не совсем мне подходит, хотелось бы посмотреть другие варианты. Спасибо
Можно через объявление внутри свойств и вызов их.
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]();
}
Можно с помощью eval, но лично я бы сделал просто switch/case, где ключ каждого кейса это название функции, а тело - это вызов нужной.
switch(funcName)
{
case "right":
flipRight();
break;
case "left":
flipLeft();
break;
default:
break;
}
UPDATE
Кстати, автоматический вызов функции через eval или другое что-то похожее - это зло! (мое мнение конечно). Замечательный способ выстрелить себе в ногу нечаянно расслабившись :)) Так что свич или подобный механизм - самое то! Только не забудте прописать кейс по умолчанию (default) от греха подальше.
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]());
Как вариант вызывать функции через 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');
};
function firstFunc () { ... }
function secondFunc () { ... }
function thirdFunc () { ... }
['first', 'third', 'second', 'first'].forEach(funcName => eval(`${funcName}Func()`))
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Для дальнейшего подключения Google Charts необходимо, чтобы выходные данные имели вид
ЗдравствуйтеНеобходимо на сайте сделать сортировку по произвольному полю и дате добавления одновременно