У меня есть список продаж, как показано ниже:
List<Map<String,dynamic>> sales = [
{'paid': 2000, 'name': 'person1'},
{'paid': 2500, 'name': 'person2'},
{'paid': 5600, 'name': 'person1'},
{'paid': 974.0, 'name': 'person2'},
];
Я хочу суммировать уплаченную сумму и показать в ListView.builder, как показано ниже:
человек1 : 7600 человек2 : 3474
Мне нужна помощь в том, как вычислить каждого отдельного человека на карте в Dart/Flutter.
Заранее спасибо.
этот код может помочь вам:
void main() {
List<Map<String, dynamic>> sales = [
{'paid': 2000, 'name': 'person1'},
{'paid': 2500, 'name': 'person2'},
{'paid': 5600, 'name': 'person1'},
{'paid': 974.0, 'name': 'person2'},
];
Map map = Map();
for (var sale in sales) {
if (map.keys.contains(sale['name'])) {
map[sale["name"]] = map[sale["name"]] + sale['paid'];
} else
map[sale["name"]] = sale['paid'];
}
print(map.toString());
}
где вывод будет:
{person1: 7600, person2: 3474.0}
Я бы выбрал более подробный метод, но это позволит вам сохранить ссылку на ваши результаты.
final List<Map<String, dynamic>> sales = [
{'paid': 2000, 'name': 'person1'},
{'paid': 2500, 'name': 'person2'},
{'paid': 5600, 'name': 'person1'},
{'paid': 974.0, 'name': 'person2'},
];
final salesByName = <String, List<Map<String, dynamic>>>{};
for (final entry in sales) {
if (salesByName.keys.contains(entry["name"] as String)) {
salesByName[entry["name"] as String]?.add(entry);
} else {
salesByName[entry["name"] as String] = [entry];
}
}
final salesByNameSum = <String, double>{};
for (final name in salesByName.entries) {
print("${name.key} has ${name.value.length} entries");
double sum = 0.0;
for (final sale in name.value) {
sum += sale['paid'] as double;
}
salesByNameSum[name.key] = sum;
}
for (final entry in salesByNameSum.entries) {
print('${entry.key}: ${entry.value}');
}
Сначала вы должны создать карту, используя name
в качестве ключа и содержащую в своем значении список карт продаж. Таким образом, вы можете легко получить доступ к списку транзакций каждого человека.
Затем вы можете создать еще одну карту меньшего размера, содержащую исключительно name
в качестве ключа и sum
в качестве значения.
Вот, например, DartPad с чистым дротиком: https://dartpad.dev/?id=2f4e9b102ba931846bc8734c1180b29f
Надеюсь, поможет!
Замечательно. Большое спасибо за подробное объяснение.
Есть еще один способ сделать это. Следуя методу, использованному для этот ответ, с некоторыми дополнительными изменениями в логике:
void main() {
List<Map<String, dynamic>> sales = [
{'paid': 2000, 'name': 'person1'},
{'paid': 2500, 'name': 'person2'},
{'paid': 5600, 'name': 'person1'},
{'paid': 974.0, 'name': 'person2'},
];
var result = sales.groupBy((m) => m['name']).map(
(key, value) => MapEntry(
key,
value.fold<double>(0.0, (a, b) => a + b['paid']),
),
);
print(result);
}
// use this extension
extension Iterables<E> on Iterable<E> {
Map<K, List<E>> groupBy<K>(K Function(E) keyFunction) => fold(
<K, List<E>>{},
(Map<K, List<E>> map, E element) =>
map..putIfAbsent(keyFunction(element), () => <E>[]).add(element));
}
он будет производить что-то вроде этого:
{person1: 7600.0, person2: 3474.0}
Вы можете попробовать запустить его на dartpad.
в первую очередь нужно сгруппировать по полю имени