Как фильтровать массив, содержащий функции

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