如何在Dart中重新排列地图键?

时间:2019-09-20 17:03:37

标签: flutter dart

我有如下地图:

{
 "Future": [
{
  "accountId": 57,
  "firstName": "Inez",
  "lastName": "Mitchell",
  "middleName": "J",
 }
],
"Overdue": [
 {
  "accountId": 5,
  "firstName": "Mak",
  "lastName": "Mitchell",
  "middleName": "M",
 }
],
"Due Today": [
 {
  "accountId": 59,
  "firstName": "Jack",
  "lastName": "Daniel",
  "middleName": "P",
 }
]
}

,并希望按以下顺序绘制地图,首先是“今天到期”,最后是“过期第二”,最后是“未来”。

  {
  "Due Today": [
 {
  "accountId": 59,
  "firstName": "Jack",
  "lastName": "Daniel",
  "middleName": "P",
 }
],
"Overdue": [
 {
  "accountId": 5,
  "firstName": "Mak",
  "lastName": "Mitchell",
  "middleName": "M",
 }
],"Future": [
{
  "accountId": 57,
  "firstName": "Inez",
  "lastName": "Mitchell",
  "middleName": "J",
 }
]

}

这些键的长度也为3,但有时我们只有两个键,它们表示“到期日”和“未来”,但我们必须确保订单的顺序为1.“到期日” 2.过期3.未来

3 个答案:

答案 0 :(得分:2)

没有可以简单地重新排列普通Dart贴图的迭代顺序的操作。

Dart映射通常默认使用LinkedHashMap,它按键插入顺序对其元素(例如用于迭代)进行排序。

如果已经存在某个键,则更改其值不会更改该键在迭代顺序中的位置,但是添加的任何新键都将在所有现有键之后结束。 这是更改迭代顺序的唯一可行方法:删除键并再次添加它,这会将其置于迭代顺序的末尾,而不是先前的位置。

因此,要对地图重新排序,最简单的方法是创建新地图:

var newMap = <String, List<Map<String, String>>>{};
for (var key in ["Due Today", "Overdue", "Future"]) {
   if (map.containsKey(key)) newMap[key] = map[key];
}

然后newMap按正确的顺序排列键。如果要将现有地图更新为相同顺序,则可以执行以下操作:map..clear()..addAll(newMap);

如果您想避免多余的地图,可以删除按键,然后重新添加。

for (var key in ["Due Today", "Overdue", "Future"]) {
   if (map.containsKey(key)) {
     var value = map[key];
     map.delete(key);
     map[key] = value;
   }
}  

这应该删除并重新添加每个密钥(如果有的话),并按照您想要的顺序进行。

答案 1 :(得分:0)

 var keys = abc.keys.toList()..shuffle();  
  for(var k in keys) {
print('$k, ${abc[k]}');}

答案 2 :(得分:0)

你需要做的步骤:

  1. 将地图转换为临时列表
  2. 对列表进行编辑
  3. 清除地图
  4. 将列表中的条目复制回地图

**

> extension ExtensionsOnMap on Map<String, ChannelItem> {
>       void replace(int index, String key, ChannelItem channelItem) {
>         
>         var tmpLst = this.entries.map((e) => MapEntry(e.key, e.value)).toList();
>     
>         tmpLst.removeAt(index);
>         tmpLst.insert(index, new MapEntry(key, channelItem));
>     
>         this.clear();
>     
>         tmpLst.forEach((mapEntry) => this[mapEntry.key] = mapEntry.value);
>       }
>     }

**