如何在Dart中构建嵌套数据结构的映射列表?
优化层级数据转映射列表的实现方案
问题背景
需要将List<Foo>结构中的每个Bar与所属Foo的someVal关联,生成统一的映射列表,现有实现使用了嵌套循环,希望得到更简洁高效的方案。
优化后的实现
利用Dart的map+expand链式调用,直接完成层级展开与映射,无需嵌套循环:
class Bar{ String someVal; int num; Bar(this.someVal, this.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("someString1", [bar1, bar2, bar3]); Bar bar4 = Bar("val4", 2); Bar bar5 = Bar("val5", 3); Bar bar6 = Bar("val6", 1); Foo foo2 = Foo("someString2", [bar4, bar5, bar6]); List<Foo> foos = [foo1, foo2]; // 优化后的核心代码 final namedBars = foos.expand((foo) => foo.bars.map((bar) => {"someVal": foo.someVal, "bar": bar}) ).toList(); // 验证输出结果 namedBars.forEach(print); }
优化说明
- 移除嵌套循环:通过
expand将每个Foo对应的Map列表直接展开为扁平列表,无需手动维护索引、计数等变量 - 减少中间变量:无需额外创建
allBars、countsBar这类临时集合,直接在遍历过程中完成关联映射 - 逻辑更直观:每个
Foo的someVal直接与自身包含的Bar绑定,代码可读性更强 - 性能更高效:避免了原方案中多次遍历列表的操作,仅需两次遍历(一次遍历所有
Foo,一次遍历每个Foo下的Bar)
内容的提问来源于stack exchange,提问作者BugsBuggy
相关产品推荐
相关产品推荐

