You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Dart:优化分类详情映射列表实现代码

简化交易分类统计的实现方案

现有一组交易数据,需要实现一个getter来展示分类维度的详情,包括特定分类的条目数量、总支出。当前实现较为繁琐,希望获取更简洁的实现方案。

原始交易数据

List<Map<String, dynamic>> transactions = [
  {
    'category': 'Food',
    'amount': 100,
  },
  {
    'category': 'Travel',
    'amount': 30,
  },
  {
    'category': 'Food',
    'amount': 90,
  },
  {
    'category': 'Travel',
    'amount': 50,
  },
  {
    'category': 'Shopping',
    'amount': 1300,
  },
  {
    'category': 'Food',
    'amount': 130,
  },
];

期望输出

[
  {'category':'Food','total':320,'entries':3},
  {'category':'Travel','total':80,'entries':2},
  {'category':'Shopping','total':1300,'entries':1}
]

注:原期望输出中的数值与实际数据不符,已按真实计算结果修正

当前实现代码

List<String> get availablecategories {
  List<String> categories = [];

  transactions.forEach((element) {
    if (!categories.contains(element['category']))
      categories.add(element['category']);
  });
  return categories;
}

List<Map<String, dynamic>> get categorydetails {
  List<Map<String, dynamic>> templist = [];

  availablecategories.forEach((element) {
    var temp = transactions.where((trans) {
      return element == trans['category'];
    }).toList();

    int totalexp = temp.fold(0,
        (previousValue, element) => previousValue + element['amount'] as int);

    templist.add({
      'category': element,
      'amount': totalexp,
      'entries': temp.length,
    });
  });
  return templist;
}

void main() {
  print(categorydetails);
}

优化后的简洁实现

使用Map分组统计,只需一次遍历即可完成所有计算,避免多次循环带来的性能损耗,代码更紧凑:

List<Map<String, dynamic>> get categoryDetails {
  final categoryStats = <String, Map<String, dynamic>>{};

  for (final trans in transactions) {
    final category = trans['category'] as String;
    final amount = trans['amount'] as int;

    categoryStats.putIfAbsent(category, () => {
      'category': category,
      'total': 0,
      'entries': 0,
    });

    categoryStats[category]!['total'] = (categoryStats[category]!['total'] as int) + amount;
    categoryStats[category]!['entries'] = (categoryStats[category]!['entries'] as int) + 1;
  }

  return categoryStats.values.toList();
}

void main() {
  print(categoryDetails);
}

优化点说明

  • 无需单独维护availablecategories getter,分组过程自动收集所有分类
  • 仅遍历交易列表一次,相比原方案多次遍历(收集分类+每个分类过滤列表)效率更高
  • 使用putIfAbsent简化分类初始化逻辑,代码更简洁易读

内容的提问来源于stack exchange,提问作者Irfan Ganatra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:15:27