Flutter如何按userID匹配合并两个不同长度的Map列表
Flutter 合并用户信息与订单数据列表
需求说明
从数据库获取两组数据:
- 用户详情+银行信息列表
- 用户订单信息列表
需要按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
相关产品推荐
相关产品推荐

