JavaScript中实现数组子数组去重及出现次数统计的方法
JavaScript 子数组去重与频次统计实现
核心原理
JavaScript 中数组属于引用类型,直接使用===对比或作为对象/Map的键时,对比的是内存地址而非数组内容,因此普通的元素频次统计方案无法直接生效。我们可以先将子数组序列化为可等值对比的基础类型标识(如JSON字符串、自定义拼接字符串),再基于标识做去重和统计即可。
实现代码
合并实现(单次遍历同时拿到两个结果,性能最优)
function handleSubarray(arr) { const countMap = new Map(); for (const item of arr) { // 序列化子数组作为唯一标识key,元素都是简单类型时直接用JSON.stringify即可 const key = JSON.stringify(item); if (countMap.has(key)) { countMap.get(key).count += 1; } else { countMap.set(key, { value: item, count: 1 }); } } const uniqueSubarrays = []; const frequency = []; for (const { value, count } of countMap.values()) { uniqueSubarrays.push(value); frequency.push(count); } return { uniqueSubarrays, frequency }; }
使用示例
const input = [[0, 0], [0, 1], [1, 0], [0, 0], [0, 1]]; const { uniqueSubarrays, frequency } = handleSubarray(input); // 去重结果:[[0,0],[0,1],[1,0]] // 频次结果:[2,2,1]
拆分独立函数
如果需要两个独立的功能函数,可以分别实现如下:
// 获取去重后的子数组 function getUniqueSubarrays(arr) { const keySet = new Set(); const result = []; for (const item of arr) { const key = JSON.stringify(item); if (!keySet.has(key)) { keySet.add(key); result.push(item); } } return result; } // 获取子数组出现频次,顺序和去重数组顺序一致 function getSubarrayFrequency(arr) { const countMap = new Map(); for (const item of arr) { const key = JSON.stringify(item); countMap.set(key, (countMap.get(key) || 0) + 1); } return Array.from(countMap.values()); }
注意事项
如果子数组内包含JSON序列化会丢失的特殊值(如undefined、Symbol、函数),可以将序列化逻辑替换为自定义拼接,只要保证分隔符不会出现在子数组元素内容中即可,比如所有元素都是数字时可以用item.join(',')作为key。
内容的提问来源于stack exchange,提问作者DrFeigenbaum
相关产品推荐
相关产品推荐

