Dart/Flutter:如何检查两个map是否相等

932 阅读3分钟

本教程展示了多个例子,说明如何在Dart和Flutter编程中比较两个map是否相等。

Compare Map of objects for equality  in Dart or Flutter

  • 在Dart和Flutter中比较两个地图是否相等
  • 在dart和flutter中检查嵌套地图的相等比较

map包含键和值对。

如果两个地图是相等的,那么它应该满足以下几点

  • 两个地图中的键和值对是相等的
  • 两个地图的长度是相等的
  • 键和值的顺序也不重要。

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

有多种方法来比较两个地图是否相等

  • 使用集合MapEquality集合模块提供MapEquality equals() 方法来比较两个普通的地图,并返回truefalse

    它不支持深度嵌套的地图结构。

下面是一个示例代码

import 'package:collection/collection.dart';

void main() {
  Map map1 = {'id': 1, 'name': 'john'};
  Map map2 = {'id': 2, 'name': 'eric'};
  Map map3 = {'id': 1, 'name': 'john'};
  print(MapEquality().equals(map1, map2)); // false
  print(MapEquality().equals(map1, map3)); // true
  if (MapEquality().equals(map1, map2)) {
    print('map are equal');
  } else {
    print('map are not equal');
  }
}

输出:

false
true
map are not equal

类似地,你也可以用DeepCollectionEquality().equals() 方法来做。

import 'package:collection/collection.dart';

void main() {
  Map map1 = {'id': 1, 'name': 'john'};
  Map map2 = {'id': 2, 'name': 'eric'};
  Map map3 = {'id': 1, 'name': 'john'};
  print(DeepCollectionEquality().equals(map1, map2)); // false
  print(DeepCollectionEquality().equals(map1, map3)); // true
  if (DeepCollectionEquality().equals(map1, map2)) {
    print('map are equal');
  } else {
    print('map are not equal');
  }
}

输出:

false
true
map are not equal
  • 使用quiver集合

在dart中,quiver包是一个用于收集实用的可重用函数的库。

它有一个mapsEqual 函数,可以比较两个地图,如果相等则返回真,否则不相等。

语法:

bool mapsEqual(Map? a, Map? b) 

它需要两个地图来比较键和值是否相等 返回值:真或假。

下面是一个示例代码

import 'package:quiver/collection.dart';

void main() {
  Map map1 = {'id': 1, 'name': 'john'};
  Map map2 = {'id': 2, 'name': 'eric'};
  Map map3 = {'name': 'john', 'id': 1};
  print(mapsEqual(map1, map2)); //false
  print(mapsEqual(map1, map3)); //true

  if (mapsEqual(map1, map2)) {
    print('map1 and  map2 are equal');
  } else {
    print('map1 and  map2 are not equal');
  }
}

如何在Flutter中检查地图是否相等

flutter/foundation.dart 有一个 mapEquals方法,对地图中的每个元素key和value对进行比较,并返回布尔类型的相等比较结果。

bool mapEquals<T>(Map<T>? a, Map<T>? b)
  • true。如果两个地图是相等的,忽略元素的顺序,返回true。
  • false:两张地图不相等。

这里,比较两个地图,如果两个地图相等,则返回true。

下面是一个地图相等的例子

import 'package:flutter/foundation.dart';

void main() {
  Map map1 = {'id': 1, 'name': 'john'};
  Map map2 = {'id': 2, 'name': 'eric'};
  Map map3 = {'id': 1, 'name': 'john'};
  print(mapEquals(map1, map2)); // false 
  print(mapEquals(map1, map3)); // true
  if (mapEquals(map1, map2)) {
    print('map are equal');
  } else {
    print('map are not equal');
  }
}

如何在dart和flutter中比较嵌套地图是否相等?

这个例子检查两个嵌套地图是否相等。 在这个例子中:

  • 创建了两个嵌套的地图。

  • 首先使用MapEquality().equals() 检查两个地图的比较。它返回false,因为它只检查了地图结构的一个层次。

  • DeepCollectionEquality().equals() 检查嵌套地图并比较两个地图,如果嵌套地图相等,则返回真,否则返回假

import 'package:collection/collection.dart';

void main() {
  Map map1 = {
    'role': {'name': 'sales', 'id': 1}
  };
  Map map2 = {
    'role': {'name': 'admin', 'id': 2}
  };
  Map map3 = {
    'role': {'name': 'sales', 'id': 1}
  };
  print(MapEquality().equals(map1, map2)); // false
  print(MapEquality().equals(map1, map3)); // false
  print(DeepCollectionEquality().equals(map1, map2)); // false
  print(DeepCollectionEquality().equals(map1, map3)); // true
  if (DeepCollectionEquality().equals(map1, map2)) {
    print('nested map are equal');
  } else {
    print('nested map are not equal');
  }
}

输出:

false
false
false
true
nested map are not equal

结论

在本教程中,学习了如何在Dart和flutter编程中对两个地图和嵌套地图进行比较和平等。