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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:37:58