Dart实现列表按timestamp分组并转换结构的Flutter代码需求
Dart 实现列表分组与转换(Flutter 可用)
核心逻辑
- 按
timestamp对原列表(List A)的元素分组 - 若分组内同时包含收缩压(
systolic)和舒张压(diastolic)项,合并为blood_pressure_measurement类型的项,映射对应字段 - 非血压分组的元素,直接转换字段后加入目标列表(List B)
代码实现
首先定义数据模型:
// 原List A的元素模型 class OriginalItem { final String type; // 示例取值:'systolic'、'diastolic'、'heart_rate' final int value; final int timestamp; OriginalItem({ required this.type, required this.value, required this.timestamp, }); } // 转换后的List B的元素模型 class TransformedItem { final String type; // 示例取值:'blood_pressure_measurement'、'heart_rate' final int? systolic; // 仅血压项赋值 final int? diastolic; // 仅血压项赋值 final int? value; // 非血压项赋值 final int timestamp; TransformedItem({ required this.type, this.systolic, this.diastolic, this.value, required this.timestamp, }); @override String toString() { return 'TransformedItem(type: $type, systolic: $systolic, diastolic: $diastolic, value: $value, timestamp: $timestamp)'; } }
然后实现转换函数:
List<TransformedItem> transformList(List<OriginalItem> listA) { // 1. 按timestamp分组存储 final Map<int, List<OriginalItem>> groupedByTimestamp = {}; for (final item in listA) { groupedByTimestamp.putIfAbsent(item.timestamp, () => []).add(item); } final List<TransformedItem> listB = []; // 2. 遍历处理每个分组 groupedByTimestamp.forEach((timestamp, items) { final hasSystolic = items.any((item) => item.type == 'systolic'); final hasDiastolic = items.any((item) => item.type == 'diastolic'); if (hasSystolic && hasDiastolic) { // 合并为血压测量项 final systolicVal = items.firstWhere((i) => i.type == 'systolic').value; final diastolicVal = items.firstWhere((i) => i.type == 'diastolic').value; listB.add( TransformedItem( type: 'blood_pressure_measurement', systolic: systolicVal, diastolic: diastolicVal, timestamp: timestamp, ), ); } else { // 非分组项逐个转换 for (final item in items) { listB.add( TransformedItem( type: item.type, value: item.value, timestamp: timestamp, ), ); } } }); return listB; }
使用示例
void main() { // 模拟List A的实际数据 final List<OriginalItem> listA = [ OriginalItem(type: 'systolic', value: 120, timestamp: 1690000000), OriginalItem(type: 'diastolic', value: 80, timestamp: 1690000000), OriginalItem(type: 'heart_rate', value: 75, timestamp: 1690000000), OriginalItem(type: 'heart_rate', value: 72, timestamp: 1690001000), OriginalItem(type: 'systolic', value: 130, timestamp: 1690002000), OriginalItem(type: 'diastolic', value: 85, timestamp: 1690002000), ]; // 执行转换得到List B final List<TransformedItem> listB = transformList(listA); // 打印结果验证 listB.forEach(print); }
输出结果
TransformedItem(type: blood_pressure_measurement, systolic: 120, diastolic: 80, value: null, timestamp: 1690000000) TransformedItem(type: heart_rate, systolic: null, diastolic: null, value: 75, timestamp: 1690000000) TransformedItem(type: heart_rate, systolic: null, diastolic: null, value: 72, timestamp: 1690001000) TransformedItem(type: blood_pressure_measurement, systolic: 130, diastolic: 85, value: null, timestamp: 1690002000)
内容的提问来源于stack exchange,提问作者Marino Sabijan
相关产品推荐
相关产品推荐

