为何该for循环无法移除backSet数组中所有含重复元素的子数组?
过滤含重复元素的子数组问题
你需要过滤掉二维数组backSet中所有包含重复元素的子数组,但当前代码未达到预期效果,像[1,2,2]这类子数组仍会保留在数组里。你的原代码如下:
for(z=0; z<backSet.length; z++){ backSet[z].sort(); tempBackSort = []; for(k=0; k< backSet[count].length; k++){ if(tempBackSort.includes(backSet[count][k])){ backSet.splice(backSet.indexOf(backSet[count]),1); kon = 0; continue; } else{ tempBackSort.push(backSet[count][k]); kon = 1; } } if(kon===1){ count++; } backSet[z].sort(); }
原代码的问题
- 同时用
z和count两个变量遍历,逻辑混乱,极易出现索引错位,导致部分子数组未被检查 - 使用
splice删除元素后数组长度变化,但z仍持续递增,会跳过后续元素 - 重复调用
sort()无意义,还会修改原数组的元素顺序 - 用
includes检查重复效率低,且删除元素后未终止当前子数组的检查,易引发错误
正确实现方式
直接用数组filter方法结合Set判断子数组是否含重复元素——Set会自动去重,只要子数组转成Set后的大小和原长度不一致,就说明存在重复元素,直接过滤:
// 生成新数组,仅保留所有元素唯一的子数组 const filteredBackSet = backSet.filter(subArr => { return new Set(subArr).size === subArr.length; });
如果要直接修改原数组而非生成新数组,可以从后往前遍历(避免splice删除元素后索引错位):
// 从原数组中移除含重复元素的子数组 for (let i = backSet.length - 1; i >= 0; i--) { const subArr = backSet[i]; if (new Set(subArr).size !== subArr.length) { backSet.splice(i, 1); } }
内容的提问来源于stack exchange,提问作者Herblawunf
相关产品推荐
相关产品推荐

