如何在包含子列表的数组中提取唯一组合
嵌套数组移除重复子列表
针对你给出的嵌套数组去重需求,这里提供两种实用的实现方案:
方案一:利用JSON序列化快速去重(适合简单子数组)
由于数组是引用类型,直接用Set无法识别内容相同的子数组,我们可以先将子数组序列化为字符串,利用字符串的唯一性去重,再转回数组。
如果你的需求是只保留重复出现过的子列表的唯一实例(即排除只出现一次的[2,5]),代码如下:
const originalArr = [ [ 1, 2 ], [ 3, 5 ], [ 2, 5 ], [ 3, 5 ], [ 1, 2 ] ]; // 第一步:统计每个子列表的出现次数 const countMap = {}; originalArr.forEach(item => { const key = JSON.stringify(item); countMap[key] = (countMap[key] || 0) + 1; }); // 第二步:筛选出出现多次的子列表并去重 const result = Array.from( new Set(originalArr.filter(item => countMap[JSON.stringify(item)] > 1).map(JSON.stringify)) ).map(str => JSON.parse(str)); console.log(result); // 输出: [ [ 1, 2 ], [ 3, 5 ] ]
如果只是需要移除重复项,保留所有子列表的唯一实例(即结果包含[2,5]),可以简化为:
const uniqueArr = Array.from( new Set(originalArr.map(item => JSON.stringify(item))) ).map(str => JSON.parse(str)); console.log(uniqueArr); // 输出: [ [ 1, 2 ], [ 3, 5 ], [ 2, 5 ] ]
方案二:自定义数组比较函数(无序列化依赖)
如果不想用JSON序列化,可以自己实现子数组的相等判断逻辑,适合子数组元素为基本类型的场景:
const originalArr = [ [ 1, 2 ], [ 3, 5 ], [ 2, 5 ], [ 3, 5 ], [ 1, 2 ] ]; // 判断两个子数组是否完全相等 function isEqual(arr1, arr2) { if (arr1.length !== arr2.length) return false; for (let i = 0; i < arr1.length; i++) { if (arr1[i] !== arr2[i]) return false; } return true; } // 统计每个子列表的出现次数 const countMap = new Map(); originalArr.forEach(item => { let matched = false; for (const [key] of countMap) { if (isEqual(key, item)) { countMap.set(key, countMap.get(key) + 1); matched = true; break; } } if (!matched) countMap.set(item, 1); }); // 筛选出重复出现的子列表 const result = []; countMap.forEach((count, key) => { if (count > 1) result.push(key); }); console.log(result); // 输出: [ [ 1, 2 ], [ 3, 5 ] ]
内容的提问来源于stack exchange,提问作者Marcel Dz
相关产品推荐
相关产品推荐

