deleteSame function

Map<String, dynamic> deleteSame(
  1. Map<String, dynamic> firstMap,
  2. Map<String, dynamic> secondMap, {
  3. List<String> ignoreKeys = const [],
  4. List<String> forceDelete = const [],
})

this method will return a firstMap after remove all same values that match second map

Implementation

Map<String, dynamic> deleteSame(
  Map<String, dynamic> firstMap,
  Map<String, dynamic> secondMap, {
  List<String> ignoreKeys = const [],
  List<String> forceDelete = const [],
}) {
  try {
    final keys = firstMap.keys.toList();
    for (var i = 0; i < keys.length; i++) {
      final key = keys[i];
      if (ignoreKeys.contains(key)) continue;
      if (forceDelete.contains(key)) {
        firstMap.remove(key);
        continue;
      }
      if (firstMap[key] is Map && secondMap[key] is Map) {
        final result = deleteSame(firstMap[key], secondMap[key],
            ignoreKeys: ignoreKeys, forceDelete: forceDelete);
        if (result.isEmpty) firstMap.remove(key);
      } else if (firstMap[key] is List &&
          secondMap[key] is List &&
          (firstMap[key] as List).every((e) => e is Map) &&
          (secondMap[key] as List).every((e) => e is Map)) {
        for (var j = 0; j < firstMap[key].length; j++) {
          deleteSame(firstMap[key][j], secondMap[key][j],
              ignoreKeys: ignoreKeys);
        }
        (firstMap[key] as List).removeWhere((e) => e.isEmpty);
        if (firstMap[key].isEmpty) firstMap.remove(key);
      } else if (firstMap[key] is List && secondMap[key] is List) {
        if (listEquals(firstMap[key], secondMap[key])) firstMap.remove(key);
      } else if (firstMap[key] == secondMap[key]) {
        firstMap.remove(key);
      }
    }
  } catch (_) {}

  return firstMap;
}