flutter 如何比较两个List< Map>类型以识别匹配项和不匹配项

2w3rbyxf  于 2023-05-19  发布在  Flutter
关注(0)|答案(3)|浏览(297)

我想要的是从dart中的两个List类型中获取所有匹配和不匹配的项目。所以假设我有一个列表a和列表B,我如何获得一个差异,比如列表c。
下面是我目前遇到的问题。

var a = [
{"id":"1","b":"2"},
{"id":"2","d":"4"},
{"id":"3","f":"6"}
]; 

 var b = [
{"id":"1","b":"2"},
{"id":"3","d":"6"}
];

如何获得列表c的差异:

c = [{"id":"2","d":"4"}]
4urapxun

4urapxun1#

你可以比较如下:
对于不匹配的记录为:

var c= a.where((e)=>b.where((ee)=>e['id']==ee['id']).toList().isEmpty).toList();

匹配记录为:

var c= a.where((e)=>b.where((ee)=>e['id']==ee['id']).toList().isNotEmpty).toList();
cigdeys3

cigdeys32#

我不确定我是否理解得很好,但这将是我的第一个方法。时间复杂度不是最好的,它可能可以优化。当我确信这是你要找的东西时,我可能会尝试做这件事。

typedef mapList = List<Map<String, String>>;

mapList substractMaps(mapList a, mapList b) {
  mapList difference = [];
  a.forEach((aMap){
    final currentIdValue = aMap['id'];
    bool found = false;
    b.forEach((bMap) {
      if(bMap['id'] == currentIdValue) {
        found = true;
      }
    });
    if(!found) {
      difference.add(aMap);
    }
  });
    
 return difference;
}
b4lqfgs4

b4lqfgs43#

您有两个Map列表,您要取其差异。最快的解决方案是将这两个列表转换为不可变Map的集合,这些Map可以正确地用作集合键,然后取集合的差异。就像这样:

import 'package:fast_immutable_collections/fast_immutable_collections.dart';

void main(List<String> arguments) {
  final a = [
    {"id": "1", "b": "2"},
    {"id": "2", "d": "4"},
    {"id": "3", "f": "6"}
  ];

  final b = [
    {"id": "1", "b": "2"},
    {"id": "3", "d": "6"}
  ];

  final aSet = a
      .map(
        (e) => IMap(e),
      )
      .toSet();
  final bSet = b
      .map(
        (e) => IMap(e),
      )
      .toSet();

  print(
    aSet.difference(bSet).toList(),
  );
}

这导致:

[{
   id: 2,
   d: 4
}, {
   id: 3,
   f: 6
}]

这似乎是你想要的。
更新:不完全。您没有指定{"id":"3","d":"6"}会发生什么。我把它作为这些集合的一个区别。你需要澄清你的问题。

相关问题