You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 14:06:04