飞镖:使用地图过滤列表

时间:2019-11-02 12:27:27

标签: flutter dart

列表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>'. 

我在做什么错了?

谢谢!

3 个答案:

答案 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}]