javascript中对复杂对象数组按多字段联合去重的核心是精准生成唯一键:推荐用json.stringify([a,b,c])构造字符串key配合map;也可用自定义getkey函数+set过滤;或用reduce+findindex兼容旧环境;需覆盖最后项时总调用map.set(key,item)。

JavaScript 中对复杂对象数组按多个字段联合去重,核心思路是:把多个字段值拼成唯一标识(如字符串或对象),再用 Map 或 Set 去重。关键不在“去重方法”,而在“如何精准生成联合键”。
用 Map + 字符串键(推荐,简洁可靠)
把需要联合判断的字段值按固定顺序拼成字符串作为 key,确保相同字段组合总生成相同 key,不同组合不冲突。注意处理 undefined、null 和类型差异:
- 用 JSON.stringify([a, b, c]) 最稳妥——自动处理类型、null、undefined,并保持顺序
- 避免直接 a + '|' + b + '|' + c,容易因字段含分隔符或类型隐式转换出错(如 true + '|' + 1 → "true|1",但 [true, 1] 和 ["true", "1"] 会撞键)
- 示例:按 name 和 category 去重
const arr = [
{ id: 1, name: '苹果', category: '水果', price: 5 },
{ id: 2, name: '苹果', category: '水果', price: 6 }, // 重复键,保留第一个
{ id: 3, name: '香蕉', category: '水果', price: 3 },
{ id: 4, name: '苹果', category: '零食', price: 8 }
];
const unique = Array.from(
arr.reduce((map, item) => {
const key = JSON.stringify([item.name, item.category]);
if (!map.has(key)) map.set(key, item);
return map;
}, new Map()).values()
);
// 结果保留 id:1、id:3、id:4 的对象
用 Set + 自定义序列化函数(适合字段多或需特殊处理)
当字段需要过滤、格式化(如忽略大小写、截取长度、转数字)时,封装一个生成 key 的函数,再用 Set 辅助去重:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 先 map 生成带 key 的新数组,再 filter 配合 Set 记录已见 key
- 例如:按 email(忽略大小写)和 age(取整)联合去重
const getKey = ({ email, age }) =>
`${String(email).toLowerCase()}|${Math.floor(age)}`;
const seen = new Set();
const uniqueByEmailAge = arr.filter(item => {
const key = getKey(item);
if (seen.has(key)) return false;
seen.add(key);
return true;
});
用 reduce + findIndex(兼容性好,但性能略低)
不依赖 Map/Set,适合需支持老旧环境的场景。每次用 findIndex 检查前面是否已有相同联合字段的对象:
- 注意:findIndex 内部要严格比对每个字段,推荐用 every + 数组解构提升可读性
- 性能随数组增长明显下降(O(n²)),小数据量(
const fields = ['name', 'category'];
const unique = arr.reduce((acc, cur) => {
const isDuplicate = acc.find(prev =>
fields.every(field => prev[field] === cur[field])
);
if (!isDuplicate) acc.push(cur);
return acc;
}, []);
进阶:保留最后一次出现的对象(而非第一次)
只需把 reduce 中的逻辑稍作调整——不跳过重复项,而是覆盖已有 key 对应的值:
- Map 方式:始终 map.set(key, item),最后取 values()
- 这样最后一个匹配该 key 的对象会覆盖前面的
const latest = Array.from(
arr.reduce((map, item) => {
const key = JSON.stringify([item.name, item.category]);
map.set(key, item); // 总是覆盖
return map;
}, new Map()).values()
);
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










