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

Dart按BankName匹配合并动态List JSON的类型错误解决

问题:合并银行账户列表时的类型错误

现有存储用户银行账户信息的动态列表existedAccountList,结构包含BankName与accountsDetails字段。当用户在HDFC银行新增账户时,账户被存储在动态列表accountList中,需将其合并到existedAccountList对应BankName的accountsDetails字段中。编写的合并函数出现以下类型错误:

Uncaught Error: TypeError: Instance of 'JSArray': type 'JSArray' is not a subtype of type 'Iterable<Map<String, String>>'


示例数据

现有列表existedAccountList

[
   {
      "BankName":"HDFC",
      "accountsDetails":[
         {
            "Type":"SAVINGS",
            "accReferenceNumber":"HDFC560811476",
            "AccNumber":"XXXXX1476"
         },
         {
            "Type":"current",
            "accReferenceNumber":"HDFC560811476",
            "AccNumber":"XXXXX1476"
         }
      ]
   }
]

新增账户列表accountList

[
   {
      "Type":"SAVINGS",
      "accReferenceNumber":"HDFC002255588",
      "AccNumber":"XXXXX1564"
   },
   {
      "Type":"current",
      "accReferenceNumber":"HDFC002255589",
      "AccNumber":"XXXXX1576"
   }
]

原错误函数

List<dynamic> addAccountToExistedBankAccountList(
  List<dynamic> existedAccountList,
  List<dynamic> accountlist,
  String bankName,
) {
for (Map data in existedAccountList) {
    if (bankName.toLowerCase() == data["BankName"].toString().toLowerCase()) {
      data["accountsDetails"].addAll(accountlist);
    }
  }
  return existedAccountList; 
}

错误原因

报错核心是类型不匹配:Dart推断data["accountsDetails"]为Iterable<Map<String, String>>类型,但传入的accountlist是List<dynamic>,直接调用addAll触发类型检查失败。


修正后的代码

通过显式类型转换和检查,解决类型兼容问题,同时提升代码健壮性:

List<dynamic> addAccountToExistedBankAccountList(
  List<dynamic> existedAccountList,
  List<dynamic> accountlist,
  String bankName,
) {
  for (var data in existedAccountList) {
    // 先校验data的类型是否为Map,避免类型转换失败
    if (data is Map && bankName.toLowerCase() == data["BankName"].toString().toLowerCase()) {
      var accounts = data["accountsDetails"];
      // 校验accountsDetails是否为List类型
      if (accounts is List) {
        // 将动态列表转换为目标Map类型后批量添加
        accounts.addAll(accountlist.cast<Map<String, dynamic>>());
      }
    }
  }
  return existedAccountList;
}

关键优化点

  • 增加类型校验:提前判断data和accountsDetails的类型,避免潜在的空指针和类型错误
  • 类型转换:用cast<Map<String, dynamic>>()将动态列表转换为addAll可接收的类型
  • 逻辑保留:完全保留原合并逻辑,同时提升代码的稳定性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 07:05:26