我有如下地图:
{
"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.未来
答案 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)
你需要做的步骤:
**
> 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);
> }
> }
**