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

Flutter如何按userID匹配合并两个不同长度的Map列表

Flutter 合并用户信息与订单数据列表

需求说明

从数据库获取两组数据:

  1. 用户详情+银行信息列表
  2. 用户订单信息列表

需要按userID匹配合并两组数据,若用户无对应订单,订单相关字段设为null。

原始数据

用户数据

List<Map<String, dynamic>> userData = [
  {
    'name': 'User 1',
    'msisdn': '+2540700222333',
    'userID': '15e15701',
    'bank_accountsId': null,
    'accountsId': '15e15700',
    'accountBalance': 0.0,
    'accountCredit': 0.0,
    'accountDebit': 0.0
  },
  {
    'name': 'User 2',
    'msisdn': '+254712345678',
    'userID': 'cb0033b0',
    'bank_accountsId': null,
    'accountsId': 'c3ddf800',
    'accountBalance': 0.0,
    'accountCredit': 0.0,
    'accountDebit': 0.0
  }
];

订单数据

List<Map<String, dynamic>> orderData = [
  {
    'ordersID': '091848',
    'userID': 'cb0033b0',
    'orderItemsID': '091896',
    'productUnitID': 12,
    'productID': 5,
    'inventory': 30.0,
    'skus': 1
  }
];

实现方案

简洁版(直接操作Map)

适合快速实现,无需定义模型类:

void mergeData() {
  // 将订单数据转为以userID为键的映射,移除重复的userID字段
  Map<String, Map<String, dynamic>> orderLookup = {};
  for (var order in orderData) {
    String userId = order['userID'];
    orderLookup[userId] = Map.from(order)..remove('userID');
  }

  // 定义空订单模板(无订单时用null填充)
  final emptyOrder = {
    'ordersID': null,
    'orderItemsID': null,
    'productUnitID': null,
    'productID': null,
    'inventory': null,
    'skus': null,
  };

  // 遍历用户列表,合并对应订单数据
  List<Map<String, dynamic>> mergedList = userData.map((user) {
    String userId = user['userID'];
    Map<String, dynamic> matchedOrder = orderLookup[userId] ?? emptyOrder;
    return {...user, ...matchedOrder}; // 合并两个Map
  }).toList();

  // 输出合并结果
  print(mergedList);
}

规范版(使用数据模型类)

适合项目中已有模型类的场景,代码更易维护:

// 用户信息模型
class UserInfo {
  final String name;
  final String msisdn;
  final String userId;
  final dynamic bankAccountsId;
  final String accountsId;
  final double accountBalance;
  final double accountCredit;
  final double accountDebit;

  UserInfo({
    required this.name,
    required this.msisdn,
    required this.userId,
    this.bankAccountsId,
    required this.accountsId,
    required this.accountBalance,
    required this.accountCredit,
    required this.accountDebit,
  });

  factory UserInfo.fromMap(Map<String, dynamic> map) => UserInfo(
        name: map['name'],
        msisdn: map['msisdn'],
        userId: map['userID'],
        bankAccountsId: map['bank_accountsId'],
        accountsId: map['accountsId'],
        accountBalance: map['accountBalance'],
        accountCredit: map['accountCredit'],
        accountDebit: map['accountDebit'],
      );

  Map<String, dynamic> toMap() => {
        'name': name,
        'msisdn': msisdn,
        'userID': userId,
        'bank_accountsId': bankAccountsId,
        'accountsId': accountsId,
        'accountBalance': accountBalance,
        'accountCredit': accountCredit,
        'accountDebit': accountDebit,
      };
}

// 订单信息模型
class UserOrder {
  final String ordersId;
  final String userId;
  final String orderItemsId;
  final int productUnitId;
  final int productId;
  final double inventory;
  final int skus;

  UserOrder({
    required this.ordersId,
    required this.userId,
    required this.orderItemsId,
    required this.productUnitId,
    required this.productId,
    required this.inventory,
    required this.skus,
  });

  factory UserOrder.fromMap(Map<String, dynamic> map) => UserOrder(
        ordersId: map['ordersID'],
        userId: map['userID'],
        orderItemsId: map['orderItemsID'],
        productUnitId: map['productUnitID'],
        productId: map['productID'],
        inventory: map['inventory'],
        skus: map['skus'],
      );

  Map<String, dynamic> toMap() => {
        'ordersID': ordersId,
        'orderItemsID': orderItemsId,
        'productUnitID': productUnitId,
        'productID': productId,
        'inventory': inventory,
        'skus': skus,
      };

  // 空订单模板
  static Map<String, dynamic> emptyOrderMap() => {
        'ordersID': null,
        'orderItemsID': null,
        'productUnitID': null,
        'productID': null,
        'inventory': null,
        'skus': null,
      };
}

// 合并逻辑
void mergeWithModels() {
  // 转换为模型列表
  List<UserInfo> users = userData.map((e) => UserInfo.fromMap(e)).toList();
  List<UserOrder> orders = orderData.map((e) => UserOrder.fromMap(e)).toList();

  // 构建订单映射
  Map<String, Map<String, dynamic>> orderMap = {};
  for (var order in orders) {
    orderMap[order.userId] = order.toMap();
  }

  // 合并数据
  List<Map<String, dynamic>> mergedList = [];
  for (var user in users) {
    Map<String, dynamic> userMap = user.toMap();
    Map<String, dynamic> order = orderMap[user.userId] ?? UserOrder.emptyOrderMap();
    userMap.addAll(order);
    mergedList.add(userMap);
  }

  print(mergedList);
}

最终合并结果

[
  {
    "name": "User 1",
    "msisdn": "+2540700222333",
    "userID": "15e15701",
    "bank_accountsId": null,
    "accountsId": "15e15700",
    "accountBalance": 0.0,
    "accountCredit": 0.0,
    "accountDebit": 0.0,
    "ordersID": null,
    "orderItemsID": null,
    "productUnitID": null,
    "productID": null,
    "inventory": null,
    "skus": null
  },
  {
    "name": "User 2",
    "msisdn": "+254712345678",
    "userID": "cb0033b0",
    "bank_accountsId": null,
    "accountsId": "c3ddf800",
    "accountBalance": 0.0,
    "accountCredit": 0.0,
    "accountDebit": 0.0,
    "ordersID": "091848",
    "orderItemsID": "091896",
    "productUnitID": 12,
    "productID": 5,
    "inventory": 30.0,
    "skus": 1
  }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:55:18