如何实现4个变量从给定数组中每次取互不重复的name值?
问题根因
你的原有代码的核心逻辑缺陷是:每次只保证当前调整的变量和其余三个变量临时不重复,调整后续变量时不会校验和前面已确认变量的一致性,比如调整var2时可能会生成和已经确定的var1重复的值,最终无法保证四个变量同时互不重复。
最优实现方案
推荐使用Fisher-Yates洗牌算法实现,逻辑简洁、性能稳定,不会出现重复问题:
- 先提取原数组所有
name字段生成独立数组 - 对数组做公平随机打乱
- 取前4项即可得到4个互不重复的随机name值
const arr = [{name:"a"},{name:"b"},{name:"c"},{name:"d"},{name:"e"},{name:"f"}] function myFunction() { // 提取所有name值 const nameList = arr.map(item => item.name) // Fisher-Yates 洗牌算法随机打乱数组 for (let i = nameList.length - 1; i > 0; i--) { const randomIndex = Math.floor(Math.random() * (i + 1)); // 交换元素位置 [nameList[i], nameList[randomIndex]] = [nameList[randomIndex], nameList[i]] } // 解构取前4个不重复的随机值 const [var1, var2, var3, var4] = nameList.slice(0, 4) // 此处添加你后续的业务逻辑 console.log(var1, var2, var3, var4) }
基于原有重试逻辑的修改方案
如果你想保留原有重试的思路,可以改为一次性校验所有变量是否重复,只要存在重复就全部重新生成,直到所有变量互不重复为止:
const arr = [{name:"a"},{name:"b"},{name:"c"},{name:"d"},{name:"e"},{name:"f"}] function myFunction() { let var1, var2, var3, var4 // 只要存在重复就重新生成所有四个变量 do { var1 = arr[Math.floor(Math.random() * arr.length)].name; var2 = arr[Math.floor(Math.random() * arr.length)].name; var3 = arr[Math.floor(Math.random() * arr.length)].name; var4 = arr[Math.floor(Math.random() * arr.length)].name; } while (new Set([var1, var2, var3, var4]).size !== 4) // 此处添加你后续的业务逻辑 console.log(var1, var2, var3, var4) }
注:该方案在极端情况下可能出现多次重试,性能不如洗牌算法稳定,更推荐优先使用第一种方案。
内容的提问来源于stack exchange,提问作者CodingPhoenix8
相关产品推荐
相关产品推荐

