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

如何基于Model数据动态构建层级化Map并转换为JSON格式?

解决方案:层级化分组Model列表为团队->项目->工程师结构

首先明确目标数据结构:外层是团队名为键的Map,每个团队对应的值是项目名为键的Map,项目名对应的值是该项目下的工程师列表,也就是Map<String, Map<String, List<String>>>。

代码实现(两种方式)

方式1:forEach遍历初始化层级

List<Model> models = [
  Model('A', 'php', 'engineer1'),
  Model('A', 'flutter', 'engineer2'),
  Model('A', 'flutter', 'engineer3'),
  Model('B', 'java', 'engineer4'),
];

// 初始化目标结构
Map<String, Map<String, List<String>>> result = {};

for (var model in models) {
  // 1. 检查团队是否存在,不存在则初始化项目Map
  if (!result.containsKey(model.team)) {
    result[model.team] = {};
  }
  
  // 2. 检查当前团队下的项目是否存在,不存在则初始化工程师列表
  var projectMap = result[model.team]!;
  if (!projectMap.containsKey(model.projectName)) {
    projectMap[model.projectName] = [];
  }
  
  // 3. 将工程师添加到对应项目的列表中
  projectMap[model.projectName]!.add(model.engineersName);
}

// 输出结果
print(result);

方式2:fold方法链式分组(更简洁)

var result = models.fold<Map<String, Map<String, List<String>>>>({}, (acc, model) {
  // 处理团队层级,不存在则初始化项目Map
  acc[model.team] ??= {};
  // 处理项目层级,不存在则初始化工程师列表
  acc[model.team]![model.projectName] ??= [];
  // 添加工程师到对应列表
  acc[model.team]![model.projectName]!.add(model.engineersName);
  return acc;
});

问题原因分析

你之前遇到的空指针异常,是因为错误定义了目标结构:Map<dynamic, List<Map<dynamic, dynamic>>>不符合需求——团队对应的不是项目Map的列表,而是以项目名为键的Map,访问未初始化的层级时自然会触发空指针。

示例输出结构

运行上述代码后,格式化后的JSON输出如下:

{
  "A": {
    "php": ["engineer1"],
    "flutter": ["engineer2", "engineer3"]
  },
  "B": {
    "java": ["engineer4"]
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 18:39:21