从数组中随机抽取文本且抽取后删除、无剩余时触发提示的实现方法
代码调整方案
现有代码问题
- 随机索引计算逻辑错误:
Math.floor(Math.random() * messages.length)得到的结果范围已经是0 ~ messages.length - 1,额外减1会导致出现-1索引,拿到undefined - 未实现抽中后删除元素的逻辑,也没有数组为空的判断逻辑
场景1:允许直接修改原数组
使用数组的*splice*方法实现,该方法会移除指定位置的元素并返回被移除的元素集合,同时直接修改原数组:
const messages = ["first", "two", "three", "four"]; function getRandomMessage() { // 数组为空时直接返回提示 if (messages.length === 0) { return "列表中无更多答案"; } // 生成合法随机索引 const randomIndex = Math.floor(Math.random() * messages.length); // 移除对应索引的1个元素,取返回结果的第一个值为抽中文本 return messages.splice(randomIndex, 1)[0]; }
调用测试示例:
console.log(getRandomMessage()) // 随机返回4个元素中的1个 console.log(getRandomMessage()) // 随机返回剩余3个元素中的1个 console.log(getRandomMessage()) // 随机返回剩余2个元素中的1个 console.log(getRandomMessage()) // 返回最后剩下的1个元素 console.log(getRandomMessage()) // 输出:列表中无更多答案
场景2:不希望修改原数组
先对原数组做浅拷贝,在拷贝后的数组上操作,需要重置抽取池时重新拷贝即可:
const originalMessages = ["first", "two", "three", "four"]; // 初始化抽取池,拷贝原数组 let messagePool = [...originalMessages]; function getRandomMessage() { if (messagePool.length === 0) { return "列表中无更多答案"; } const randomIndex = Math.floor(Math.random() * messagePool.length); return messagePool.splice(randomIndex, 1)[0]; } // 需要重置抽取池时执行以下代码即可 // messagePool = [...originalMessages]
内容的提问来源于stack exchange,提问作者tanaallen
相关产品推荐
相关产品推荐

