Dart:用地图过滤列表



列表1:我有一个包含用户ID的列表:(选定的用户(

['1234', '3455', '2330', '1111']

列表2:我有第二个列表,其中包含用户的完整配置文件(地图(:(所有用户(

[{"id": '1234', "name": "username"}, {"id": '3455' .... ]

LIST3:我想要一个包含所有选定用户的第三个列表:返回LIST2的所有id为LIST1的用户。

我试过这个。。。

list1.forEach((element) =>
list3.add(list2.where((data) => data['id'] == element)));

但这不起作用。。。

error: The argument type 'Iterable<Map<String, dynamic>>' can't be assigned to the parameter type 'Map<String, dynamic>'. 

我做错了什么?

提前感谢!

您可以使用list3 = list2.where((map)=>list1.contains(map["id"])).toList()创建list3

问题的原因是您的list3需要一个映射,但您的list2.where(..)代码返回List[map, map, map]

有几种可能的方法可以做到这一点。一个简单的方法是浏览第二个列表,并使用Listcontains()检查用户id是否在第一个列表中。

例如:

使用map():

List ids = ['1234', '3455', '2330', '1111'];
List users = [{"id": '1234', "name": "username"}, {"id": '3455', "name": "username"}];
List selectedUsers = users.map((user) {
if(ids.contains(user["id"])) return user;
return null;
}).toList();

使用forEach():的另一种方法

List selectedUsers = [];
users.forEach((u) {
if(ids.contains(u["id"])) selectedUsers.add(u);
});
print(selectedUsers);

我们不需要太多代码(where()很方便(:

List selectedUsers = users.where((u) => ids.contains(u["id"])).toList();

在Dart Pad中编辑此项。

其他可能的方法让它变得更容易Dart为您提供了一些方法,如where(),如果您想替换第二个列表retainsWhere() and removeWhere()。欲了解更多信息,请阅读飞镖清单。

最新更新