如何从含897个元素的pokemon数组中随机取5项生成新数组?
实现方案
原有代码存在两处明显问题:
- 循环逻辑错误:每次迭代直接将
pokedex赋值为仅包含当前索引的单元素数组,运行结束后只会得到长度为1、存储最后一个索引值的数组 - 缺少随机取值、数量限制的相关逻辑
修复后代码
// 先预取全量宝可梦列表,避免循环中重复调用方法 const allPokemon = pokemon.all() const pokedex = [] // 循环控制数组长度为5 while (pokedex.length < 5) { // 生成合法的随机数组下标 const randomIdx = Math.floor(Math.random() * allPokemon.length) // 可选去重逻辑:避免抽到重复的宝可梦,不需要可直接删除if判断 if (!pokedex.includes(allPokemon[randomIdx])) { pokedex.push(allPokemon[randomIdx]) } } app.get('/dex', (req, res) => { res.send(pokedex) })
逻辑说明
- 用
while循环替代原有的遍历全量数组的for循环,只要目标数组长度不足5就持续随机取值,精准控制最终返回数量 Math.random()生成0到1之间的随机数,乘以数组总长度后用Math.floor取整,得到范围在0到896的合法下标(数组下标从0开始计数)- 去重逻辑可根据需求选择保留或删除,删除后运行效率更高但可能出现重复的宝可梦名称
内容的提问来源于stack exchange,提问作者user17203628
相关产品推荐
相关产品推荐

