如何在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
相关产品推荐
相关产品推荐

