如何去除二维数组中的重复元素?
如何去除二维数组中的重复元素?
看起来你已经找对了方向——用filter搭配findIndex来判断元素是不是第一次出现,但你的代码里有个小疏漏导致结果为空,我来帮你捋捋~
问题出在哪?
你写的findIndex里的箭头函数用了花括号包裹逻辑,但没有明确返回判断条件!箭头函数的规则是:如果用花括号{}包裹代码块,就必须手动写return来返回结果,不然函数会默认返回undefined。这样一来,findIndex永远找不到匹配的元素,返回的都是-1,自然所有元素都不满足=== index的条件,最后就得到空数组啦。
修正后的代码
我们只需要给findIndex里的判断逻辑加上return就可以了:
myarray = myarray.filter( (element, index, self) => self.findIndex((e) => { // 加上return返回判断结果 return e[0] === element[0] && e[1] === element[1] && e[2] === element[2] }) === index )
或者也可以简化箭头函数,去掉花括号,这样表达式会自动返回结果,代码更简洁:
myarray = myarray.filter( (element, index, self) => self.findIndex(e => e[0] === element[0] && e[1] === element[1] && e[2] === element[2] ) === index )
更高效的替代方法
上面的方法时间复杂度是O(n²)(因为filter和findIndex都是遍历数组),如果你的数组很大,推荐用Set来优化,时间复杂度可以降到O(n):
const uniqueSet = new Set(); const uniqueArray = myarray.filter(item => { // 把子数组转成字符串作为唯一标识 const key = JSON.stringify(item); if (!uniqueSet.has(key)) { uniqueSet.add(key); return true; } return false; });
原理是:数组是引用类型,直接放进Set没法判断是否重复,所以我们把每个子数组转成JSON字符串(或者用item.join(',')也可以,只要能唯一标识子数组内容就行),用Set记录已经出现过的键,遍历一次就能完成去重。
备注:内容来源于stack exchange,提问作者whitebear
相关产品推荐
相关产品推荐

