JavaScript:生成无重复随机字符串数组遇阻,去重方法无效
解决数组去重无效的问题
首先,你写的filter去重代码逻辑完全错了——str.indexOf(idArray)是在单个字符串元素str里查找整个数组idArray(数组会被转成字符串比如"img1,img2"),这显然永远找不到,所以这个判断永远返回true,等于根本没做过滤。
正确的数组去重方法
方法1:用Set(最简单高效)
ES6的Set会自动忽略重复值,直接把数组转成Set再转回数组就行:
const filtered = [...new Set(idArray)];
方法2:用filter结合indexOf(兼容旧环境)
核心逻辑是:只保留当前元素在数组中第一次出现的实例,也就是元素的索引等于它第一次出现的索引:
const filtered = idArray.filter((str, index) => idArray.indexOf(str) === index);
结合你的业务场景优化
看你的业务代码,你是从初始数组['img1','img2']里随机选元素设置图片src。如果你的需求是避免重复选取同一个元素(比如不想连续选到img1,或者选过的不再选),其实不需要事后去重,直接维护一个可用元素的数组更合理:
var idArray = ['img1', 'img2']; var availableIds = [...idArray]; // 维护可用的ID池 // 随机数函数(补全实现) function getRandomInt(max) { return Math.floor(Math.random() * max); } if (availableIds.length > 0) { // 从可用池里随机选一个 var newID = getRandomInt(availableIds.length); var newCube = availableIds.splice(newID, 1)[0]; // 选完就从池里移除,避免重复选 // 设置图片src document.getElementById(newCube).src = "assets/button-yellow_x64.png"; } else { console.log("所有元素都已经选过啦"); }
如果你的需求只是清理数组里的重复项(比如你会往idArray里新增元素导致重复),那就用前面说的Set或filter方法,在需要去重的时候执行即可。
内容的提问来源于stack exchange,提问作者Fyreaken
相关产品推荐
相关产品推荐

