遍历 dart/flutter 中的地图值

5 dart flutter

我基本上来自 JS 背景,现在正在尝试使用 Flutter 框架。我一直在格式化从 API 收到的数据。

数据接收到一组对象

 [
   {
     "id": 1,
     "name": "name1",
     "type": "Both",
     "count": 4
   },
   {
     "id": 2,
     "name": "name2",
     "type": "Both",
     "count": 6
   },
   {
     "id": 3,
     "name": "name1",
     "type": "Both",
     "count": 2
   },
   {
     "id": 4,
     "name": "name3",
     "type": "Both",
     "count": 8
   },
   ......
 ]
Run Code Online (Sandbox Code Playgroud)

我的要求是我必须根据名称对数据进行分组

{
  name1: [
           {
             "id": 1, "name":"name1", "type": "Both", "count": 4
           },
           {
             "id": 3, "name":"name1", "type": "Both", "count": 2
           }
  ],
  name2: [
           {
             "id": 2, "name":"name2", "type": "Both", "count": 6
           }
  ],
  .....
}
Run Code Online (Sandbox Code Playgroud)

在 dart 中,我设法使用 collections.dart 包中的 groupBy 进行分组。

问题是我无法遍历分组数据。我需要访问计数以对每个分组名称进行一些操作。

下面是我试过的代码剪断

  Map data;
  List partySnapData;
  Map newMap;

  Future _getTopParties() async {
   final response =await http.get(API_URL + '/getPartySnapShot');
   data =json.decode(response.body);
   partySnapData = data['resultObj'];
   setState(() {
    newMap = groupBy(partySnapData, (obj) => obj['party_name']);
    for(var v in newMap.values) {
     print(v);
    }
 });
Run Code Online (Sandbox Code Playgroud)

}

print(v) 实际上给了我映射到地图 EG 的值

[
  { "id": 1, "name":"name1", "type": "Both", "count": 4 },
  { "id": 3, "name":"name1", "type": "Both", "count": 2 }
],
.....,
......
Run Code Online (Sandbox Code Playgroud)

现在,我如何循环或迭代数组,这里是v,以便我可以访问里面的元素?

Dpe*_*nha 19

忽略您的具体案例,但回答问题,以防其他人像我在搜索时遇到这个问题How to iterate through map values in dart / flutter

有一种更简单、更好的方法。

这是最好的方法(因为这样您可以breakfor loop找到正确的条目并执行您必须执行的操作以避免不必要的迭代之后)。

for (MapEntry<type, type> item in myMap.entries) {
  //Here each item has a key and a value proterties.
  //Don't forget to use break; to end the loop when you are done and avoid unnecessary iterations.
}
Run Code Online (Sandbox Code Playgroud)

这是更简单的:

myMap.forEach((key, value) {
  //Here you have key and value for each item in your map but you can't break the loop
  //to avoid unnecessary iterations.
  //This approach is only useful when you need to perform changes in all Map items.
});
Run Code Online (Sandbox Code Playgroud)


小智 7

我找到了解决方案。我张贴那个,以防它帮助某人。

我想遍历 v 以生成对象。

newMap = groupBy(partySnapData, (obj) => obj['party_name']);
for(var v in newMap.values) {
 print(v);
 //below is the solution
  v.asMap().forEach((i, value) {
    print('index=$i, value=$value');
  }
}
Run Code Online (Sandbox Code Playgroud)