You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,逐个处理每个键值对:
    • 同时满足以下两个条件时,走递归合并逻辑:
      1. 拷贝后的source存在当前key,且该key对应的value是Map<String, dynamic>类型
      2. 待合并MaptoMerge中当前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 04:36:06