Flutter中如何根据ID去重List并合并子数组
Flutter合并重复optionGroupId的选项组并整合options
解决思路
通过Map以optionGroupId为键对选项组分组,遍历源列表时:
- 若键已存在,合并该分组的
options数组 - 若键不存在,直接添加该分组到Map中
最后将Map的值转为列表,得到去重并合并后的结果。
方案一:使用强类型模型(推荐)
先定义对应的数据模型,保证Flutter项目中类型安全:
// 选项模型 class Option { final String name; final double price; final int optionId; Option({ required this.name, required this.price, required this.optionId, }); factory Option.fromJson(Map<String, dynamic> json) => Option( name: json['name'], price: json['price'].toDouble(), optionId: json['optionId'], ); Map<String, dynamic> toJson() => { 'name': name, 'price': price, 'optionId': optionId, }; } // 选项组模型 class OptionGroup { final String name; final int optionGroupId; final List<Option> options; OptionGroup({ required this.name, required this.optionGroupId, required this.options, }); factory OptionGroup.fromJson(Map<String, dynamic> json) => OptionGroup( name: json['name'], optionGroupId: json['optionGroupId'], options: (json['options'] as List).map((e) => Option.fromJson(e)).toList(), ); Map<String, dynamic> toJson() => { 'name': name, 'optionGroupId': optionGroupId, 'options': options.map((e) => e.toJson()).toList(), }; }
实现合并逻辑:
List<OptionGroup> mergeOptionGroups(List<OptionGroup> sourceGroups) { final Map<int, OptionGroup> groupMap = {}; for (final group in sourceGroups) { if (groupMap.containsKey(group.optionGroupId)) { // 合并已有分组的options final existingGroup = groupMap[group.optionGroupId]!; groupMap[group.optionGroupId] = OptionGroup( name: existingGroup.name, optionGroupId: existingGroup.optionGroupId, options: [...existingGroup.options, ...group.options], ); } else { // 添加新分组 groupMap[group.optionGroupId] = group; } } return groupMap.values.toList(); }
示例用法
void main() { // 模拟从JSON解析的源数据 final rawSource = [ { "name": "CHỌN SIZE", "optionGroupId": 1557, "options": [{"name": "Size L", "price": 12.0, "optionId": 6734}] }, { "name": "TOPPING", "optionGroupId": 1558, "options": [{"name": "Đường Nâu", "price": 12.0, "optionId": 6732}] }, { "name": "TOPPING", "optionGroupId": 1558, "options": [{"name": "Thạch Dừa", "price": 8.0, "optionId": 6731}] } ]; // 转为强类型列表 final sourceGroups = rawSource.map((e) => OptionGroup.fromJson(e)).toList(); // 执行合并 final mergedGroups = mergeOptionGroups(sourceGroups); // 输出结果(转为JSON格式) print('{"optionGroups": ${mergedGroups.map((e) => e.toJson()).toList()}}'); }
方案二:直接处理原始JSON Map
如果不需要强类型,可直接对JSON格式的Map列表进行处理:
List<Map<String, dynamic>> mergeRawOptionGroups(List<Map<String, dynamic>> source) { final Map<int, Map<String, dynamic>> groupMap = {}; for (final group in source) { final groupId = group['optionGroupId'] as int; if (groupMap.containsKey(groupId)) { // 合并options数组 final existingGroup = groupMap[groupId]!; existingGroup['options'] = [...(existingGroup['options'] as List), ...(group['options'] as List)]; } else { // 复制原对象存入Map,避免修改源数据 groupMap[groupId] = {...group}; } } return groupMap.values.toList(); }
示例用法
void main() { final rawSource = [ // 你的源数据Map列表 ]; final merged = mergeRawOptionGroups(rawSource); print('{"optionGroups": $merged}'); }
内容的提问来源于stack exchange,提问作者Vu Thanh
相关产品推荐
相关产品推荐

