Dart中Map的deepMerge深合并方法工作原理及对应代码作用说明
Dart deepMerge 方法作用与执行流程解析
这是一个针对Map<String, dynamic>类型的Dart扩展方法,核心作用是实现两个Map的深度合并:和普通的浅合并直接覆盖同key值不同,遇到嵌套的子Map时不会直接覆盖整个子Map,而是递归合并子Map内部的键值对。
具体执行流程
- 第一步:先拷贝调用方法的原始Map:
var source = <String, dynamic>{...this};
这里的this就是调用deepMerge的原始Map,用展开运算符做浅拷贝,后续所有修改都在新拷贝上执行,不会改动原始的两个Map,避免副作用。 - 第二步:遍历待合并Map(入参
toMerge)的所有key,逐个处理每个键值对:- 同时满足以下两个条件时,走递归合并逻辑:
- 拷贝后的
source存在当前key,且该key对应的value是Map<String, dynamic>类型 - 待合并Map
toMerge中当前key对应的value也是Map<String, dynamic>类型
此时会递归调用子Map的deepMerge方法,合并两个子Map后赋值给source的当前key
- 拷贝后的
- 任意一个条件不满足时,直接走覆盖逻辑:把
toMerge中当前key的value直接赋值给source的对应key
- 同时满足以下两个条件时,走递归合并逻辑:
- 第三步:返回合并完成的新
sourceMap
示例效果
你可以参考以下测试用例直观理解合并规则:
// 调用方法的原始Map final originMap = { 'id': 1, 'info': { 'name': '张三', 'age': 20 } }; // 待合并的Map final toMergeMap = { 'id': 101, 'info': { 'name': '李四', 'gender': '男' }, 'status': 1 }; // 执行合并 final mergedMap = originMap.deepMerge(toMergeMap);
合并后输出的mergedMap结果:
{ 'id': 101, // 非Map类型的同key值直接被待合并Map覆盖 'info': { 'name': '李四', // 子Map内的同key值覆盖 'age': 20, // 子Map内原始Map有、待合并Map没有的key保留 'gender': '男' // 子Map内待合并Map新增的key保留 }, 'status': 1 // 顶层待合并Map新增的key保留 }
边界注意点
如果原始Map的同key值是子Map,但待合并Map的同key值不是Map类型,会直接覆盖整个子Map,不会保留原来的子Map内容。
内容的提问来源于stack exchange,提问作者Faisal Bin Mohammad Ali
相关产品推荐
相关产品推荐

