#javascript #arrays #function #loops #if-statement
Вопрос:
так что, например, я должен написать оператор if / else сокращенно или в функциях вместо:
if (hero === «Robin»){return callRobin()} … или вместо случаев переключения.
const callRobin = () => `Hey Robin`;
const callRaven = () => `Hey Raven`;
const callStarFire = () => `Hey StarFire`;
const callBeastBoy = () => `Hey BeastBoy`;
// these were the functions!!
const herosFuncArr = [callRobin, callRaven, callStarFire, callBeastBoy]; //an array that contains the functions
const herosStringsArr = ['Robin', 'Raven', 'StarFire', 'BeastBoy'];
const myFunc = param => param == herosStringsArr.filter(x => x.includes(param)) ? herosFuncArr.filter(z => z.name.includes(param)()) : false;
myFunc('StarFire');
моя точка зрения в этом коде заключалась в следующем: когда мы вводим имя героя в качестве параметра, если оно существует в массиве strings, возвращаем элемент из массива functions, который имеет те же буквы, что и параметр В КАЧЕСТВЕ ФУНКЦИИ, как указано в двойных круглых скобках.
Я перепробовал так много вещей, также пробовал eval (`call${param}()) но, видимо, это неприемлемо. также пробовал .toString но не сработало (для меня). любая помощь будет оценена.
Комментарии:
1. Откуда берется
name
свойство?2. Если вам нужно вызывать функции, вычисляя имя функции во время выполнения, вы, вероятно, допустили несколько серьезных ошибок в дизайне. Я бы умолял вас сделать несколько шагов назад и понять само требование, прежде чем вы получите кодовую базу, которая совершенно не поддерживается в долгосрочной перспективе (что произойдет, если вам в конечном итоге придется поддерживать несколько сотен, несколько тысяч или даже несколько миллионов этих
heros
значений? Вы ожидаете, что на самом деле войдете и создадите одну функцию для каждого из бесчисленных героев, которые у вас будут?)
Ответ №1:
Гораздо лучше исключить все эти функции и создать одну callHero
функцию, в которую вы можете передать имя найденного героя и вернуть строку. Вам не нужно беспокоиться filter
; используйте find
, чтобы найти первое совпадение.
И лучше не использовать includes
, потому что это будет соответствовать Star
StarFire
тому, что вы, вероятно, не хотите делать. Вместо этого просто выполните простое сравнение.
const heroes = ['Robin', 'Raven', 'StarFire', 'BeastBoy'];
// Return a string
function callHero(hero) {
return `Hey ${hero}!`;
}
function isAHero(name) {
// Find the hero in the array
const hero = heroes.find(hero => hero === name);
// If it exists call the `callHero` function with the hero name
// and return the resulting string from the function
if (hero) return callHero(hero);
// Otherwise return something else
return `Boo! ${name} is not a hero.`;
}
console.log(isAHero('Robin'));
console.log(isAHero('Billy Joel'));
console.log(isAHero('StarFire'));
console.log(isAHero('Star'));
Ответ №2:
Вы можете вызвать функции и сравнить возвращенную строку:
const callRobin = () => `Hey Robin`;
const callRaven = () => `Hey Raven`;
const callStarFire = () => `Hey StarFire`;
const callBeastBoy = () => `Hey BeastBoy`;
// these were the functions!!
const herosFuncArr = [callRobin, callRaven, callStarFire, callBeastBoy]; //an array that contains the functions
const herosStringsArr = ['Robin', 'Raven', 'StarFire', 'BeastBoy'];
const myFunc = param => param == herosStringsArr.filter(x => x.includes(param)) ? herosFuncArr.filter(z => z().includes(param)) : false;
console.log(myFunc('StarFire'));
Ответ №3:
Вы можете сделать это с помощью Map . Вы должны поместить heroStringsArr в качестве ключа, а ваши функции — в качестве значения:
const map = new Map();
map.set('Robin', () => console.log('Hey Robin'));
map.set('Raven', () => console.log('Hey Raven'));
map.set('StarFire', () => console.log('Hey StarFire'));
map.set('BeastBoy', () => console.log('Hey BeastBoy'));
const myFunc = param => map.has(param) ? map.get(param) : console.log('This function is not available!');
myFunc('Robin')();
Ответ №4:
Мне нравится идея @Andy’s только об одной функции. Также, если у вас должно быть много функций, по сути, несколько «экземпляров» одной и той же функции, вы можете начать с массива строк, которые затем можно сопоставить с помощью одной функции с массивом функций.
Вы также можете использовать регулярные выражения, как в демонстрации ниже:
const callRobin = () => `Hey Robin`;
const callRaven = () => `Hey Raven`;
const callStarFire = () => `Hey StarFire`;
const callBeastBoy = () => `Hey BeastBoy`;
// these were the functions!!
const herosFuncArr = [callRobin, callRaven, callStarFire, callBeastBoy]; //an array that contains the functions
const herosStringsArr = ['Robin', 'Raven', 'StarFire', 'BeastBoy'];
const myFunc = param => herosFuncArr.filter(f => (new RegExp(`\b${param}\b`)).test( f() )).length > 0;
console.log( myFunc('StarFire') );