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

如何在Dart中基于嵌套值对对象列表进行高效分组?

高效实现嵌套对象分组方案

你可以通过一次遍历完成所有分组操作,核心是用临时Map存储分组关系,最后转换为目标格式,具体实现如下:

class Bar{
  String someVal;
  int num;  // group by this value

  Bar(this.someVal, this.num);
  
  // 可选:重写toString方便调试
  @override
  String toString() => 'Bar(someVal: $someVal, num: $num)';
}

class Foo{
  String someVal;
  List<Bar> bars;

  Foo(this.someVal, this.bars);
}

void main()
{
  Bar bar1 = Bar("val1", 3);
  Bar bar2 = Bar("val2", 5);
  Bar bar3 = Bar("val3", 2);
  Foo foo1 = Foo("someString", [bar1, bar2, bar3]);

  Bar bar4 = Bar("val4", 2);
  Bar bar5 = Bar("val5", 3);
  Bar bar6 = Bar("val6", 1);
  Foo foo2 = Foo("someString", [bar4, bar5, bar6]);

  List<Foo> foos = [foo1, foo2];
  
  // 1. 初始化分组容器,key为Bar的num,value为对应Bar列表
  final groupedMap = <int, List<Bar>>{};
  
  // 2. 一次遍历所有嵌套的Bar,完成分组
  for (final foo in foos) {
    for (final bar in foo.bars) {
      // 如果当前num对应的列表不存在,先创建空列表
      groupedMap.putIfAbsent(bar.num, () => []).add(bar);
    }
  }
  
  // 3. 将Map转换为目标格式的List<Map>
  final groupedBars = groupedMap.entries.map((entry) {
    return {
      "num": entry.key,
      "bar": entry.value
    };
  }).toList();
  
  // 打印验证结果
  print(groupedBars);
}

方案优势

  • 遍历效率最优:仅需遍历所有Bar对象一次,时间复杂度为O(n)(n为所有Bar的总数),完全避免多次遍历嵌套结构。
  • 逻辑简洁直观:通过Map的putIfAbsent方法快速处理分组的创建与元素添加,代码可读性高。
  • 灵活可扩展:如果后续需要调整分组键或结果格式,只需修改对应转换逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 00:10:16