Skip to content

Instantly share code, notes, and snippets.

@niusounds
Last active January 28, 2026 01:28
Show Gist options
  • Select an option

  • Save niusounds/30ba030c084ccd11faaab0bf2ecd81cf to your computer and use it in GitHub Desktop.

Select an option

Save niusounds/30ba030c084ccd11faaab0bf2ecd81cf to your computer and use it in GitHub Desktop.
Map deep merge in Dart.
Map<String, dynamic> deepMergeMap(Map<String, dynamic> a, Map<String, dynamic> b) {
b.forEach((k, v) {
if (!a.containsKey(k)) {
a[k] = v;
} else {
// TODO handle List type
if (a[k] is Map) {
deepMergeMap(a[k], b[k]);
} else {
a[k] = b[k];
}
}
});
return a;
}
import 'package:map_merge/map_merge.dart';
import 'package:test/test.dart';
void main() {
test('deepMergeMap', () {
final Map<String, dynamic> a = {
'key1': {
'key1-1': 111,
'key1-2': 222,
},
'key2': {
'key2-1': 'hello',
},
};
final Map<String, dynamic> b = {
'key1': {
'key1-2': 123456,
},
'key2': {
'key2-2': 'world',
},
};
final Map<String, dynamic> expected = {
'key1': {
'key1-1': 111,
'key1-2': 123456,
},
'key2': {
'key2-1': 'hello',
'key2-2': 'world',
},
};
expect(deepMergeMap(a, b), expected);
});
}
@artuaa
Copy link

artuaa commented Apr 18, 2020

 Map<String, dynamic> deepMergeMap(Map<String, dynamic> a, Map<String, dynamic> b) {
  if(b == null) return a;
  b.forEach((k, v) {
    if (!a.containsKey(k)) {
      a[k] = v;
    } else {
      // TODO handle List type
      if (a[k] is Map) {
        deepMergeMap(a[k], b[k]);
      } else {
        a[k] = b[k];
      }
    }
  });

  return a;
} 

fix null key

@Hu-Wentao
Copy link

fix null Map

  Map<String, dynamic> deepMergeMap({
    required Map<String, dynamic> base,
    Map<String, dynamic>? addition,
  }) {
    if (addition == null) return base;
    addition.forEach((k, v) {
      if (!base.containsKey(k)) {
        base[k] = v;
      } else {
        // TODO handle List type
        if (base[k] is Map) {
          deepMergeMap(base: base[k], addition: addition[k]);
        } else {
          base[k] = addition[k];
        }
      }
    });
    return base;
  }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment