JavaScript中判断嵌套数组相等报错,如何实现数组去重?
问题解答
为什么会报错?
JavaScript的原生数组没有内置equals()方法,这个方法是Java等其他语言的数组/集合专属方法,直接调用自然会提示“is not a function”。
另外你提到==运算符不好用,是因为数组属于引用类型,==和===比较的是两个数组在内存中的引用地址,而非数组内容。哪怕两个数组元素完全一致,只要是不同的数组实例,结果都会是false。
解决方法
方法1:自定义数组内容比较函数
自己实现一个函数,逐个比对数组的每一个元素(你的数组元素都是数字,逻辑非常简单):
// 自定义数组内容相等判断函数 function arraysEqual(a, b) { if (a.length !== b.length) return false; for (let i = 0; i < a.length; i++) { if (a[i] !== b[i]) return false; } return true; } // 修改后的去重函数 function removeDuplicates(arr) { const tempArr = []; for (let i = 0; i < arr.length; i++) { let found = false; for (let j = 0; j < tempArr.length; j++) { // 用自定义函数替代equals if (arraysEqual(tempArr[j], arr[i])) { found = true; break; // 找到重复就跳出循环,节省性能 } } if (!found) { tempArr.push(arr[i]); } } return tempArr; // 注意:你原函数漏了返回结果 }
方法2:用JSON.stringify+Set简化去重
利用字符串可被Set直接比较的特性,把数组转成字符串去重后再转回数组,代码更简洁:
function removeDuplicates(arr) { const uniqueStrs = new Set(arr.map(item => JSON.stringify(item))); return Array.from(uniqueStrs, str => JSON.parse(str)); }
这个方法适合你的场景(数组元素都是数字、无特殊值),如果数组里包含undefined、function这类无法被JSON序列化的内容,就不适用了。
内容的提问来源于stack exchange,提问作者Eli Bauer
相关产品推荐
相关产品推荐

