JavaScript中Map本身不支持filter,但可利用其键唯一性实现对象数组按属性去重:遍历数组以指定属性为key存入Map,重复key自动覆盖,再用Array.from(Map.values())提取唯一项。

JavaScript 中 Map 本身不直接支持 filter,但你可以用 Map 辅助实现“按某个属性去重对象数组”,再结合 filter 或更自然的方式(如 Array.from + Map 构建唯一项)来完成。关键不是让 Map 调用 filter,而是利用 Map 的键唯一性做判重,再提取结果。
用 Map 按指定属性做键,自动去重
核心思路:遍历数组,以对象的某个属性(如 id、name)为 key 存入 Map;重复 key 会被覆盖,最终 Map 中只保留每个 key 对应的最后一个(或第一个)对象。
示例:按 id 去重,保留首次出现的对象:
const arr = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 1, name: 'Alice-updated' },
{ id: 3, name: 'Charlie' }
];
// 用 Map 记录已见过的 id,值存整个对象
const seen = new Map();
const unique = [];
for (const item of arr) {
if (!seen.has(item.id)) {
seen.set(item.id, item);
unique.push(item);
}
}
console.log(unique);
// [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, { id: 3, name: 'Charlie' }]
一行式写法:Array.from + Map 构造器
更简洁的写法,利用 Map 构造器接受可迭代对象(如 arr.map(...)),自动去重键;再用 Array.from 提取值:
✅ 保留每个 key 的最后一次出现的对象(因为 map 顺序覆盖):
const uniqueBy = (arr, key) =>
Array.from(
new Map(arr.map(item => [item[key], item])).values()
);
const result = uniqueBy(arr, 'id');
✅ 若想保留第一次出现的,把 arr 反向遍历再反转结果:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
const uniqueByFirst = (arr, key) =>
Array.from(
new Map(arr.slice().reverse().map(item => [item[key], item]))
.values()
).reverse();
为什么不用 filter?
filter 是筛选,不是去重。你不能单靠 filter 实现“根据已有状态跳过重复项”,因为它没有记忆能力。但你可以配合闭包或外部 Map 实现类似效果:
const seenIds = new Set();
const unique = arr.filter(item => {
if (seenIds.has(item.id)) return false;
seenIds.add(item.id);
return true;
});
这本质是用 Set(或 Map)辅助 filter,而非 Map 本身调用 filter。
扩展:按多个属性去重(如 name + age)
把多个属性拼成唯一字符串作为 Map 键:
const keyFn = item => `${item.name}-${item.age}`;
const uniqueByMulti = arr =>
Array.from(
new Map(arr.map(item => [keyFn(item), item])).values()
);
注意:确保属性值不会产生歧义(如 name="a-b" 和 name="a", age="b" 拼出来一样)。更安全可用 JSON.stringify([item.name, item.age])。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










