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即为目标结果数组
代码说明
- Map转换优化:仅通过一次遍历将状态列表转为映射表,后续查找无需重复遍历原列表,在数据量较大时性能优势明显。
- 原数据保护:使用
Map.from(dataItem)创建新对象,避免修改从API获取的原始数据。 - 自动空值处理:当
statesMap中无对应sessionId的键时,取值结果天然为null,直接满足需求。
内容的提问来源于stack exchange,提问作者newbie2210
相关产品推荐
相关产品推荐

