如何筛选包含函数的数组,实现输入英雄名匹配调用对应函数
可行解决方案
最优方案:对象映射表(推荐)
这是替代多分支if/else/switch的标准规范写法,查找效率为O(1),无需维护两个分离的数组,也不存在数组顺序不匹配的风险:
const callRobin = () => `Hey Robin`; const callRaven = () => `Hey Raven`; const callStarFire = () => `Hey StarFire`; const callBeastBoy = () => `Hey BeastBoy`; // 直接建立英雄名与对应调用函数的映射关系 const heroFuncMap = { Robin: callRobin, Raven: callRaven, StarFire: callStarFire, BeastBoy: callBeastBoy } const myFunc = param => heroFuncMap[param] ? heroFuncMap[param]() : false; myFunc('StarFire'); // 输出:'Hey StarFire'
后续新增英雄仅需要在heroFuncMap中新增一组键值对即可,维护成本极低。
兼容现有双数组的修正方案
如果你必须保留现有的herosFuncArr和herosStringsArr两个数组,可以修正原有代码的逻辑错误实现需求,你原有代码的问题包括:
filter方法返回的是数组,不能直接和字符串类型的参数做相等判断- 函数执行的括号位置错误,误写在了
includes方法的参数中
修正后代码:
const callRobin = () => `Hey Robin`; const callRaven = () => `Hey Raven`; const callStarFire = () => `Hey StarFire`; const callBeastBoy = () => `Hey BeastBoy`; const herosFuncArr = [callRobin, callRaven, callStarFire, callBeastBoy]; const herosStringsArr = ['Robin', 'Raven', 'StarFire', 'BeastBoy']; const myFunc = param => { const heroIndex = herosStringsArr.indexOf(param); return heroIndex > -1 ? herosFuncArr[heroIndex]() : false; } myFunc('StarFire'); // 输出:'Hey StarFire'
内容的提问来源于stack exchange,提问作者General Louay
相关产品推荐
相关产品推荐

