javascript中用reduce实现对象数组去重的核心思路是:遍历数组,用临时对象或map记录已出现的唯一标识值,只保留首次出现的对象;按单字段(如id)或组合字段(如name+age)生成唯一键,借助map高效查重并保持顺序。

JavaScript 中用 reduce 实现对象数组去重,核心思路是:遍历数组,用一个临时对象(或 Map)记录已出现的唯一标识值,只保留首次出现的对象。
按单个字段去重(如 id)
最常见场景是根据对象的某个唯一字段(比如 id)去重。利用 reduce 累积一个新数组,并用普通对象或 Set 辅助判断是否已存在该 id:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const arr = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 1, name: 'Alice2' }, // 重复 id
{ id: 3, name: 'Charlie' }
];
const uniqueById = arr.reduce((acc, item) => {
if (!acc.seen.has(item.id)) {
acc.seen.add(item.id);
acc.result.push(item);
}
return acc;
}, { seen: new Set(), result: [] }).result;
// 或更简洁写法(不推荐用于大数组,因每次查 indexOf 性能差):
// const uniqueById = arr.reduce((acc, cur) =>
// acc.some(item => item.id === cur.id) ? acc : [...acc, cur], []);
按多个字段组合去重(如 name + age)
当需依据多个属性联合判断唯一性时,可将关键字段拼成字符串作为键(注意处理 undefined / null),或用 JSON.stringify(仅适用于简单、顺序确定的对象结构):
const arr = [
{ name: 'Alice', age: 25, city: 'Beijing' },
{ name: 'Bob', age: 30, city: 'Shanghai' },
{ name: 'Alice', age: 25, city: 'Guangzhou' }, // 与第一个 name+age 相同
];
const uniqueByKeys = arr.reduce((acc, item) => {
const key = `${item.name}|${item.age}`; // 简单分隔防歧义
if (!acc.has(key)) {
acc.set(key, item);
}
return acc;
}, new Map()).values();
const result = Array.from(uniqueByKeys); // 转为数组
原地去重并保持顺序(推荐通用写法)
使用 Map 作哈希表,既保证插入顺序,又支持任意键类型(包括对象键,但此处仍建议用字符串键)。这是兼顾可读性、性能和健壮性的常用模式:
- 初始化空
Map存唯一键 → 对象映射 - 遍历时生成唯一键(如
item.id或JSON.stringify(pick(item, ['a','b']))) - 仅当
Map中无此键时才设值 - 最后用
Map.values()提取结果
注意事项
- 避免直接用
JSON.stringify(item)作为键——属性顺序不同会导致键不同(如{a:1,b:2}vs{b:2,a:1}) - 字段可能为
undefined或null,拼接前建议默认转为空字符串或跳过 - 若数据量极大(>10 万项),
reduce本身无性能问题,但注意 Map 查找是 O(1),比filter + findIndex更高效 - 去重逻辑不可逆,如需保留“最后一次”而非“第一次”,把
if (!map.has(key))改为直接map.set(key, item)即可
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










