JavaScript多维数组去重结果不符预期,求解决方案
解决数组中子数组去重/子集过滤问题
嘿,我来帮你梳理一下这个问题~
首先咱们得明确核心需求:你当前的代码是在做完全相同的子数组去重,所以它会保留[3,2,1](因为它和数组里其他子数组都不完全一致),但你的预期输出要去掉它,这说明你其实想实现的是过滤掉那些是其他子数组子集的元素,对吧?
原代码的问题分析
你的原代码逻辑对完全重复的子数组去重是有效的,但写法偏绕且效率不高(每次都要遍历整个out数组)。另外,[3,2,1]转成字符串是"3,2,1",和[3,2,1,5]的"3,2,1,5"完全不同,所以代码会把它当成新元素保留,这就是为什么你得到4个元素而非预期的3个。
方案1:仅做完全相同的子数组去重(优化版)
如果你的需求只是去掉完全重复的子数组(比如重复的[1,2,3]),可以用更高效的Set实现,避免重复遍历:
let data = [ [1,2,3], [1,3,2,4], [3,2,1,5], [1,2,3], [3,2,1] ]; const seen = new Set(); const dataUnique = data.filter(item => { const str = item.toString(); if (!seen.has(str)) { seen.add(str); return true; } return false; }); console.log(dataUnique); // 输出:[[1,2,3], [1,3,2,4], [3,2,1,5], [3,2,1]]
这个写法比reduce更直观,Set的查找是O(1)级别的,效率更高。
方案2:过滤掉所有是其他子数组子集的元素(符合你的预期输出)
如果你的需求是去掉被其他更长子数组包含的元素(比如[3,2,1]是[3,2,1,5]的子集,所以要过滤),可以分两步实现:
let data = [ [1,2,3], [1,3,2,4], [3,2,1,5], [1,2,3], [3,2,1] ]; // 第一步:先去掉完全重复的子数组 const seen = new Set(); const uniqueData = data.filter(item => { const str = item.toString(); if (!seen.has(str)) { seen.add(str); return true; } return false; }); // 第二步:过滤掉被其他更长数组包含的子集元素 const filtered = uniqueData.filter(item => { return !uniqueData.some(other => { // 判断是否存在另一个更长的数组,包含当前数组的所有元素 return other !== item && other.length > item.length && item.every(num => other.includes(num)); }); }); console.log(filtered); // 输出:[[1,2,3], [1,3,2,4], [3,2,1,5]]
这个方案先精简重复元素,再通过every和some组合判断子集关系,最终得到你预期的结果。
内容的提问来源于stack exchange,提问作者Rauf
相关产品推荐
相关产品推荐

