列表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]
。
有几种可能的方法可以做到这一点。一个简单的方法是浏览第二个列表,并使用List
contains()
检查用户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()
。欲了解更多信息,请阅读飞镖清单。