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

Flutter中如何合并两个数组并按externalSessionId匹配填充states

如何在Flutter中按externalSessionId合并两个数组

需求说明

遍历data['list']中的每个元素,以externalSessionId为唯一标识在dataStates['list']中查找对应元素:

  • 找到匹配项:合并两个元素的字段(保留data中的所有字段,加上dataStates中的states字段)
  • 未找到匹配项:给当前元素添加states: null字段
    最终将所有处理后的元素存入新数组stickedArray。

最优实现方案

为了提升查找效率(避免每次遍历dataStates['list']的O(n)开销),先将dataStates['list']转换为以externalSessionId为键的Map,之后的查找操作可以降到O(1)。

以下是完整的Dart代码实现:

// 假设你已经从API获取到了data和dataStates
final List<Map<String, dynamic>> dataList = data['list'];
final List<Map<String, dynamic>> dataStatesList = dataStates['list'];

// 第一步:将dataStatesList转换为Map,key是externalSessionId,value是对应的states
final Map<String, Map<String, dynamic>> statesMap = {};
for (final stateItem in dataStatesList) {
  final sessionId = stateItem['externalSessionId'] as String;
  statesMap[sessionId] = stateItem['states'] as Map<String, dynamic>;
}

// 第二步:遍历dataList,生成合并后的数组
final List<Map<String, dynamic>> stickedArray = [];
for (final dataItem in dataList) {
  final sessionId = dataItem['externalSessionId'] as String;
  // 创建新的Map,复制dataItem的所有字段,避免修改原数据
  final mergedItem = Map<String, dynamic>.from(dataItem);
  // 从statesMap中获取对应的states,无匹配则自动为null
  mergedItem['states'] = statesMap[sessionId];
  stickedArray.add(mergedItem);
}

// 此时stickedArray即为目标结果数组

代码说明

  1. Map转换优化:仅通过一次遍历将状态列表转为映射表,后续查找无需重复遍历原列表,在数据量较大时性能优势明显。
  2. 原数据保护:使用Map.from(dataItem)创建新对象,避免修改从API获取的原始数据。
  3. 自动空值处理:当statesMap中无对应sessionId的键时,取值结果天然为null,直接满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 18:01:01