javascript数组去重需显式统计重复信息,map频次统计最通用:先遍历计数,再分离唯一值与重复项(如{a:2,b:3}),或用set边去重边记录被过滤项,封装函数可返回含unique、duplicates等字段的完整结果。

JavaScript 数组去重时默认只保留唯一值,不记录被过滤的重复项。若需统计哪些元素被去重、各重复几次,需在去重过程中主动收集信息,不能依赖 Set 或 filter 等无状态方法直接完成。
用 Map 记录频次,再分离唯一项与重复项
这是最清晰可控的方式:先遍历一次统计每个值的出现次数,再据此拆分出唯一值数组和重复项统计对象。
- 遍历原数组,用
Map(或普通对象)累加每个值的出现次数 - 筛选出出现次数 > 1 的值,组成重复项统计(如
{ "a": 2, "b": 3 }) - 同时生成去重后数组(如用
Array.from(map.keys())或filter((v, i, a) => a.indexOf(v) === i))
示例:
const arr = ['a', 'b', 'a', 'c', 'b', 'b'];
const count = new Map();
<p>arr.forEach(item => {
count.set(item, (count.get(item) || 0) + 1);
});</p><p>const unique = [...count.keys()];
const duplicates = Object.fromEntries(
[...count].filter(([, cnt]) => cnt > 1)
); // { a: 2, b: 3 }</p><p>console.log('去重后:', unique); // ['a', 'b', 'c']
console.log('重复项统计:', duplicates); // { a: 2, b: 3 }</p>边去重边收集,用 Set + 额外数组记录重复项
适合需要保留首次出现顺序、且只需知道“哪些被跳过”(不要求精确次数)的场景。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
Set跟踪已见过的值 - 遇到重复值时,推入
duplicates数组(可去重存一次,或保留每次重复) - 最终
duplicates就是所有被过滤掉的重复项(含重复)
示例(保留每次重复):
const arr = ['a', 'b', 'a', 'c', 'b', 'b'];
const seen = new Set();
const unique = [];
const duplicates = [];
<p>arr.forEach(item => {
if (seen.has(item)) {
duplicates.push(item); // 记录这次被过滤的项
} else {
seen.add(item);
unique.push(item);
}
});</p><p>console.log('去重后:', unique); // ['a', 'b', 'c']
console.log('被过滤项:', duplicates); // ['a', 'b', 'b']</p>封装成可复用函数,返回完整结果
把逻辑收拢,返回包含 unique、duplicates、duplicateCount 等字段的对象,便于后续使用。
- 支持传入自定义键提取函数(如对对象数组按某字段去重)
- 可选是否统计总重复数量(如共过滤 4 个元素)或各值重复次数
- 避免副作用,不修改原数组
简化版封装示例:
function dedupeWithStats(arr, keyFn = x => x) {
const count = new Map();
arr.forEach(item => {
const k = keyFn(item);
count.set(k, (count.get(k) || 0) + 1);
});
<p>const unique = arr.filter((item, i) =>
arr.findIndex(x => keyFn(x) === keyFn(item)) === i
);</p><p>const duplicateCount = Object.fromEntries(
[...count].filter(([, n]) => n > 1).map(([k, n]) => [k, n - 1])
);</p><p>return {
unique,
duplicateItems: Object.keys(duplicateCount),
duplicateCount,
totalFiltered: arr.length - unique.length
};
}</p><p>// 使用
const result = dedupeWithStats([1, 2, 2, 3, 2, 4]);
console.log(result);
// { unique: [1,2,3,4], duplicateItems: ['2'], duplicateCount: {2: 2}, totalFiltered: 2 }</p>核心在于:去重本身不保存过程信息,必须显式设计数据结构来捕获重复行为。选 Map 统计频次最通用,兼顾准确性和可读性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










