如何用JavaScript数组实现随机选择器?修复返回索引而非元素问题
修复JavaScript随机选择器返回数组元素而非索引的简洁方案
你的第一个代码问题很明确:生成了随机索引但直接返回了索引值,而非用索引去取数组里的回答内容。第二个方案用一堆if-else判断不仅繁琐,还存在隐藏bug——随机数生成放在函数外部,导致每次调用randomiser都会返回同一个结果,因为num只在初始化时生成一次。
最简修复方案(基于你的初始代码)
只需要在生成随机索引后,用这个索引访问yesOrNo数组,直接返回对应元素即可:
const yesOrNo = ['DEFINITELY!', 'yes', 'of course', 'hell no', 'no', 'absolutely not', 'maybe', 'probably']; const randomiser = (ques) => { if (typeof ques === 'string') { // 生成随机索引并返回对应元素 return yesOrNo[Math.floor(Math.random() * yesOrNo.length)]; } // 可选:处理非字符串输入的情况 return '请输入有效的问题'; }; console.log(randomiser('should i accept the company offer?')); // 示例输出:maybe
方案优势
- 简洁高效:一行代码完成随机选择,无需冗余的条件判断
- 易维护:后续新增/删除回答选项,只需要修改
yesOrNo数组,函数逻辑完全不用动 - 无隐藏bug:每次调用函数都会重新生成随机数,保证结果的随机性
你的第二个方案的问题修正
如果一定要用条件判断的方式(不推荐),至少要把随机数生成移到函数内部,同时修正随机数范围的错误(原代码里Math.floor(Math.random() *7)会导致最后一个元素probably永远无法被选中):
const randomiser = (ques) => { if (typeof ques !== 'string') return '请输入有效的问题'; const num = Math.floor(Math.random() * 8); switch(num) { case 0: return 'DEFINITELY!'; case 1: return 'yes'; case 2: return 'of course'; case 3: return 'hell no'; case 4: return 'no'; case 5: return 'absolutely not'; case 6: return 'maybe'; case 7: return 'probably'; } }; console.log(randomiser('should i accept the company offer?'));
显然第一种方案更优,完全没必要用switch或if-else来处理数组元素的选择。
内容的提问来源于stack exchange,提问作者Decodeme
相关产品推荐
相关产品推荐

