如何为数组的单个元素添加属性 实现随机选中后不再重复抽取
实现方案
带标记永久排除已选元素
由于你的初始数组元素是字符串基本类型,无法直接添加自定义属性,有两种常用实现方式:
- 方式1:将数组元素转为带标记的对象
// 初始化带标记的对象数组 const numbers = ["1","2","3","4","5"].map(val => ({ value: val, alreadyChosen: false })) // 随机抽取未选中元素的方法 function drawRandomItem() { // 过滤所有未选中的元素 const availableItems = numbers.filter(item => !item.alreadyChosen) if (!availableItems.length) { console.log('所有元素均已抽取完成') return null } // 生成随机下标 const randomIdx = Math.floor(Math.random() * availableItems.length) const targetItem = availableItems[randomIdx] // 待元素展示消失后执行该行修改标记,可根据你的业务触发时机调整 targetItem.alreadyChosen = true return targetItem.value }
- 方式2:单独维护已选元素集合,不修改原数组结构
const numbers = ["1","2","3","4","5"] const chosenSet = new Set() function drawRandomItem() { const availableItems = numbers.filter(val => !chosenSet.has(val)) if (!availableItems.length) return null const randomIdx = Math.floor(Math.random() * availableItems.length) const targetVal = availableItems[randomIdx] // 元素展示消失后加入已选集合 chosenSet.add(targetVal) return targetVal }
临时排除单个元素
仅某次抽取时跳过指定元素,不影响后续抽取的话,直接在过滤时加临时判断即可:
const numbers = ["1","2","3","4","5"] // 参数为本次需要临时排除的元素值 function drawRandomItemExclude(excludeVal) { const validList = numbers.filter(val => val !== excludeVal) if (!validList.length) return null const randomIdx = Math.floor(Math.random() * validList.length) return validList[randomIdx] } // 示例:本次抽取临时排除值为"3"的元素 console.log(drawRandomItemExclude("3"))
内容的提问来源于stack exchange,提问作者CodingPhoenix8
相关产品推荐
相关产品推荐

