如何在JavaScript二维数组中找出重复的子数组?
解决二维数组中获取重复子数组的问题
你之前的方法无效,是因为JavaScript中数组属于引用类型,indexOf方法使用严格相等(===)进行比较。两个内容完全相同的数组,它们的内存引用是不同的,所以array1.indexOf(element)只会找到当前元素自身的索引,永远等于index,导致过滤或检测逻辑失效。
方法一:将数组转为字符串进行比较
把每个子数组转为字符串(比如用JSON.stringify),通过字符串的相等性来判断重复,最后再转回原数组格式:
const array1 = [[1,2], [2,3], [1,2]]; // 转换子数组为字符串,用于快速比较 const strArray = array1.map(item => JSON.stringify(item)); // 筛选出重复的原数组元素 const duplicateItems = array1.filter((item, idx) => strArray.indexOf(JSON.stringify(item)) !== idx); // 对重复结果去重,避免多次输出同一子数组 const uniqueDuplicates = [...new Set(duplicateItems.map(JSON.stringify))].map(JSON.parse); console.log(uniqueDuplicates); // 输出: [[1,2]]
注意:如果子数组包含
undefined、函数、Symbol等无法被JSON.stringify正确序列化的类型,这种方法会失效。
方法二:直接比较子数组的内容
编写一个辅助函数,逐个比较两个数组的元素是否完全相同,再通过遍历检测重复:
const array1 = [[1,2], [2,3], [1,2]]; // 辅助函数:判断两个数组内容是否完全一致 function isArrayEqual(arrA, arrB) { if (arrA.length !== arrB.length) return false; for (let i = 0; i < arrA.length; i++) { if (arrA[i] !== arrB[i]) return false; } return true; } const duplicates = []; const seen = []; array1.forEach(item => { // 检查当前元素是否已经出现过 const exists = seen.some(seenItem => isArrayEqual(seenItem, item)); if (exists) { // 避免重复添加同一子数组 if (!duplicates.some(dup => isArrayEqual(dup, item))) { duplicates.push(item); } } else { seen.push(item); } }); console.log(duplicates); // 输出: [[1,2]]
这种方法兼容性更好,适合子数组包含各种基本类型的场景,但大数据量下性能会比字符串比较差。
方法三:使用Map记录已出现的数组
用字符串作为键,通过Map记录已经遍历过的子数组,快速判断重复:
const array1 = [[1,2], [2,3], [1,2]]; const seenMap = new Map(); const duplicates = []; array1.forEach(item => { const key = JSON.stringify(item); if (seenMap.has(key)) { // 确保同一子数组只添加一次 if (!duplicates.some(dup => JSON.stringify(dup) === key)) { duplicates.push(item); } } else { seenMap.set(key, true); } }); console.log(duplicates); // 输出: [[1,2]]
这种方法兼顾了性能和易用性,是比较通用的解决方案。
内容的提问来源于stack exchange,提问作者eibersji
相关产品推荐
相关产品推荐

