列表1:我有一个包含用户ID的列表:(选定的用户)
['1234', '3455', '2330', '1111']
列表2:我还有第二个列表,其中包含用户(地图)的完整个人资料:(所有用户)
[{"id": '1234', "name": "username"}, {"id": '3455' .... ]
列表3:我想拥有包含所有选定用户的第三个列表:返回ID为LIST 1的所有LIST 2用户。
我尝试过了...
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>'.
我在做什么错了?
谢谢!
答案 0 :(得分:3)
几乎没有办法做到这一点。一种简单的方法是使用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()
。有关更多信息,请阅读Dart List。
答案 1 :(得分:2)
您可以使用list3 = list2.where((map)=>list1.contains(map["id"])).toList()
创建列表3
问题的原因是您的list3需要一张地图,但是您的list2.where(..)
代码是返回List[map, map, map]
。
答案 2 :(得分:1)
import 'package:enumerable/enumerable.dart';
void main() {
final selectedUsers = ['1234', '3455', '2330', '1111'];
final allUsers = [
{"id": '1234', "name": "username1234"},
{"id": '3455', "name": "username3455"},
{"id": '2330', "name": "username2330"},
{"id": '1111', "name": "username1111"},
{"id": '8888', "name": "username8888"},
{"id": '9999', "name": "username9999"},
];
final q = selectedUsers.join$(allUsers, (selected) => selected,
(all) => all['id'], (selected, all) => all);
print(q.toList());
}
结果:
[{id: 1234, name: username1234}, {id: 3455, name: username3455}, {id: 2330, name: username2330}, {id: 1111, name: username1111}]