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

Flutter项目中如何将数组重复日期字段后续值设为Null?

解决方案

步骤1:定义数据模型

先把API返回的data数组对象映射为Dart类,方便后续处理:

class Transaction {
  final int sid;
  final int userSid;
  final String category;
  final String regMethod;
  final String accountCd;
  final String paymentType;
  final String bizno;
  final int amount;
  final int amountSupply;
  final String taxFreeYn;
  String? useDate; // 用可空类型支持设为null
  final String useTime;
  final int useOrganization;

  Transaction({
    required this.sid,
    required this.userSid,
    required this.category,
    required this.regMethod,
    required this.accountCd,
    required this.paymentType,
    required this.bizno,
    required this.amount,
    required this.amountSupply,
    required this.taxFreeYn,
    required this.useDate,
    required this.useTime,
    required this.useOrganization,
  });

  // 从JSON解析为Transaction实例
  factory Transaction.fromJson(Map<String, dynamic> json) {
    return Transaction(
      sid: json['sid'],
      userSid: json['userSid'],
      category: json['category'],
      regMethod: json['reg_method'],
      accountCd: json['account_cd'],
      paymentType: json['payment_type'],
      bizno: json['bizno'],
      amount: json['amount'],
      amountSupply: json['amount_supply'],
      taxFreeYn: json['tax_free_yn'],
      useDate: json['use_date'],
      useTime: json['use_time'],
      useOrganization: json['use_organization'],
    );
  }

  // 创建修改后的副本(遵循Dart不可变对象原则)
  Transaction copyWith({String? useDate}) {
    return Transaction(
      sid: this.sid,
      userSid: this.userSid,
      category: this.category,
      regMethod: this.regMethod,
      accountCd: this.accountCd,
      paymentType: this.paymentType,
      bizno: this.bizno,
      amount: this.amount,
      amountSupply: this.amountSupply,
      taxFreeYn: this.taxFreeYn,
      useDate: useDate ?? this.useDate,
      useTime: this.useTime,
      useOrganization: this.useOrganization,
    );
  }
}

步骤2:处理重复的use_date

解析API返回的JSON后,用Set记录已出现的日期,遍历列表并修改对应字段:

// 假设apiResponse是从外部API获取的原始JSON Map
Map<String, dynamic> apiResponse = {
  // 你的API返回数据
};

// 1. 解析data数组为Transaction列表
List<Transaction> originalList = (apiResponse['data'] as List)
    .map((item) => Transaction.fromJson(item))
    .toList();

// 2. 去重处理use_date
final Set<String> seenDates = {};
List<Transaction> processedList = originalList.map((item) {
  final currentDate = item.useDate;
  if (currentDate == null) return item;
  
  if (seenDates.contains(currentDate)) {
    // 重复日期,设为null或空字符串
    return item.copyWith(useDate: null); // 若要设为空字符串,改为useDate: ''
  } else {
    seenDates.add(currentDate);
    return item;
  }
}).toList();

关键说明

  • 用Set跟踪已出现的日期,查找效率为O(1),处理大数据量也不会有性能问题。
  • 通过copyWith方法生成新对象,避免修改原数据,符合Flutter的不可变状态管理习惯。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 16:42:41