【问题标题】:Dart: filter lists with mapsDart:使用地图过滤列表
【发布时间】:2019-11-02 12:27:27
【问题描述】:

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

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

列表 2:我有第二个列表,其中包含用户的完整个人资料(地图):(所有用户)

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

LIST 3:我想要包含所有选定用户的第三个列表:返回 LIST 2 中 ID 为 LIST 1 的所有用户。

我试过这个...

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

我做错了什么?

提前致谢!

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    您可以使用list3 = list2.where((map)=&gt;list1.contains(map["id"])).toList() 创建列表3

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

    【讨论】:

    • 你也可以使用像list3 = [for (var map in list2) if (list1.contains(map["id"])) map];这样的列表文字计算。
    【解决方案2】:

    有几种可能的方法来做到这一点。一种简单的方法是通过您的第二个列表并使用 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

    【讨论】:

    • 谢谢!有效,但 selectedUsers 列表有一些空元素。易卜拉欣卡拉汉的答案没有。 Flutter 也给出了一个信息:函数有返回类型...,但没有以 return 语句结束...
    猜你喜欢
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多