У меня есть List<Map>
, что мне нужно, чтобы идентификаторы были разными в списке и получали совокупное значение для каждого идентификатора.
То, что у меня сейчас есть, работает, но мне было интересно, есть ли более чистый способ сделать это?
Мой код:
List tagId = ['a', 'b'];
List oldList = [{'id': 'a', 'value': 1},
{'id': 'a', 'value': 1},
{'id': 'a', 'value': 1},
{'id': 'a', 'value': 1},
{'id': 'b', 'value': 1},
{'id': 'b', 'value': 1}];
List newList = [];
for(final i in tagId) {
int totalValue = 0;
for(final d in oldList){
if (i == d['id']){
totalValue++;
}
}
newList.add({'id': i, 'value': totalValue});
}
print(newList);
Я предполагаю, что вы написали tagList
вручную, вы не хотите делать это вручную или из другого ненужного алгоритма, который приведет к этому.
Если вам нужен только доступ к id
и value
, то вы, вероятно, хотите избежать алгоритма O(N^2)
, я написал O(N)
, который может помочь повысить производительность:
Map<String, int> map = {};
for(int index = 0; index < oldList.length; index+=1) {
map[oldList[index]["id"]] = (map[oldList[index]["id"]] ?? 0) + oldList[index]["value"] as int;
}
print(map); // {a: 4, b: 2}
и если вам нужен тот же результат, вы можете просто добавить это:
List<Map> asMapList = [];
map.forEach((key, value) {
asMapList.add({"id": key, "value": value});
} );
print(asMapList); // [{id: a, value: 4}, {id: b, value: 2}]