最简洁高效的方式是new map([...map1, ...map2]),键冲突时后者覆盖前者;需自定义逻辑时手动遍历+set;合并多个或带条件时用flatmap+array.from;注意key类型、禁用object.assign、避免冗余创建。

直接用 new Map([...map1, ...map2]) 最简洁高效,但要注意键冲突时后者覆盖前者。
基础合并:展开运算符 + 构造函数
这是最常用、性能最好的方式,适用于大多数场景:
- 利用数组展开语法把两个 Map 的键值对转为二维数组,再传给
new Map() - 如果 key 重复,
map2中的值会自动覆盖map1中同 key 的值 - 时间复杂度接近 O(n + m),底层优化充分,无额外遍历开销
示例:
const map1 = new Map([['a', 1], ['b', 2]]);
const map2 = new Map([['b', 3], ['c', 4]]);
const merged = new Map([...map1, ...map2]); // Map {'a' => 1, 'b' => 3, 'c' => 4}
需要自定义合并逻辑时:手动遍历 + set
当遇到相同 key 时不想简单覆盖,而是想求和、拼接或取最大值等,就得手动处理:
- 先复制
map1,再遍历map2,对每个 entry 判断 key 是否已存在 - 根据业务逻辑决定如何更新值,比如
merged.set(key, oldVal + newVal) - 避免反复调用
has()和get(),可先用get()尝试获取,用undefined判断是否存在
示例(数值相加):
const merged = new Map(map1);
for (const [k, v] of map2) {
const existing = merged.get(k);
merged.set(k, existing === undefined ? v : existing + v);
}
合并多个 Map 或带条件过滤
若要合并三个及以上 Map,或只合并满足某条件的 entry,推荐用 Array.from() + flatMap() 统一处理:
- 把所有 Map 转成数组,用
flatMap扁平化并可选地过滤 - 再传给
new Map(),保持语义清晰且易于扩展 - 比链式
set更函数式,也方便加filter或map预处理
示例(合并三个 Map,跳过 key 为 'temp' 的项):
const merged = new Map(
[map1, map2, map3]
.flatMap(m => Array.from(m))
.filter(([k]) => k !== 'temp')
);
注意点与避坑
几个容易忽略但影响正确性的细节:
-
Map的 key 可以是任意类型(包括对象、函数),但展开后仍能正确保留引用和相等性 - 不要用
Object.assign({}, map1, map2)—— Map 不是普通对象,这样只会得到空对象 - 避免用
forEach+set多次创建新 Map,除非真有不可变需求;原地修改更省内存 - 如果原始 Map 很大且只读,而你只需要部分 key,优先用
filter再合并,减少中间数组体积
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











