如何在Dart中检查两个地图是否相等

24

如何像Java中的equals方法一样检查两个映射是否相等?


void main() {
  Map map1 = {'size': 38, 'color': 'red'};
  Map map2 = {'size': 38, 'color': 'red'};

  if(map1== map2){//both keys and values
    print('yes');
  }else{
    print('no');
  }
}
7个回答

30
我找到了 mapEquals
    import 'package:flutter/foundation.dart';
    
    void main() {
      Map map1 = {'size': 38, 'color': 'red'};
      Map map2 = {'size': 38, 'color': 'red'};
      
    
      if(mapEquals(map1, map2)){
        print('yes');
      }else{
        print('no');
      }
    }

mapEquals 函数是 Flutter 中 'package:flutter/foundation.dart' 包中的一个实用函数。它用于比较两个映射是否相等。如果这两个映射具有相同的键,并且它们对应的值也相等,则此函数返回 true;否则,返回 false。

在给定的代码片段中,有两个映射:map1map2。这两个映射都具有相同的键('size'和'color'),并且它们对应的值(38和'red')也相等。

调用mapEquals(map1, map2)函数来比较这些映射。由于这两个映射相等,因此该函数返回true,并将“yes”打印为输出。如果这两个映射不相等,就会打印“no”。


4
如果地图包含其他地图,则此方法将无法工作。换句话说,这只是第一级比较。 - Alex.F
1
因为问题明确要求“在Dart中进行映射相等性比较”,而此答案仅适用于用户开发Flutter应用程序,所以被投票降低了。 - Brett Sutton

27

对于Flutter,如果您有一个嵌套的Map,并且需要以键值映射的方式检查其与另一个嵌套对象的相等性,请使用:

对于Flutter中的嵌套Map,如需按键和值映射检查其与另一个嵌套对象的相等性,请使用:

import 'package:collection/collection.dart';

if(DeepCollectionEquality().equals(map1, map2)) {
  print('Maps are equal');
} else {
  print('Maps are not equal');
}

21

使用 MapEquality().equals(Object a, Object b)。它会返回truefalse

import 'package:collection/equality.dart';

MapEquality().equals(map1, map2)

6
它不会比较嵌套的映射。而 DeepCollectionEquality 会。 - RustamG
1
2023年将被弃用 - GenError

5
对于非Flutter Dart代码,package:quiver 提供了一个 mapsEqual 函数来比较 Map(以及类似的函数来比较 ListSet)。

@jameesdlin 这是我的答案。它不正确吗?https://dev59.com/alIH5IYBdhLWcg3wAHn3#61765671 - BIS Tech
2
@BloodLoss,你的问题涉及Flutter,但是你的标签是dart(而不是flutter),所以我会针对你提出的问题给出一个更一般性的答案。 - jamesdlin

4

这些答案都没有对我起作用。

我尝试过使用 map1.toString() == map2.toString(),它起作用了。


4
比较字符串表示有一些问题:1. 字符串表示对顺序敏感,而你通常不关心顺序。2. 字符串表示可能是模糊的;你可能有两个不同但具有相同 .toString() 表示的映射。 - jamesdlin

3
    Map v1 = {'name': "ahmed", "age": 24};
    Map v2 = {'name': "ahmed", "age": 24};
    if(v1.toString() == v2.toString())
  print('yes');
    else{
      print('no');
    }
  }

1

我尝试不使用任何其他依赖项。您可以将以下代码复制/粘贴到Dart Playground中进行测试。

void main() {
  final map1 = {'a':1, 'b':3};
  final map2 = {'a':1, 'b':3};
  final map3 = {'b':3, 'a':1};
  final map4 = {'b':3, 'a':1, 'c':1};
  bool result = _mapEquals(map1, map2);
  print(result); // true
  result = _mapEquals(map1, map3);
  print(result); // true
  result = _mapEquals(map1, map4);
  print(result); // false
}

bool _mapEquals(Map<String, int> map1, Map<String, int> map2) {
  if (map1.keys.length != map2.keys.length) return false;

  for (String k in map1.keys) {
    if (!map2.containsKey(k)) return false;
    if (map1[k] != map2[k]) return false;
  }

  return true;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接