2>正如你在下面看到的,我有两个对象列表,我想合并成一个,它应该基于日期比较列表

//here is the list 1
List<Object1> list1=[
Object1("date":"1","day_data":12),
Object1("date":"2","day_data":15),
]

//here is the list 2
List<Object2> list2=[
Object2("date":"1","night_data":56),
Object2("date":"3","night_data":80),
];

//expected output
List<Object3> expectedList=[
Object3("date":"1","day_data":12,"night_data":56),
Object3("date":"2","day_data":15,"night_data":null),
Object3("date":"3","day_data":null,"night_data":80),
];

推荐答案

下面的代码应该可以做到这一点.它使用Map,其中键是主键.值是list1list2中的reduce(它甚至将list1和/或list2中的date个重复项合并).最后,我添加了一些断言来实际测试它是否有效.

这里还有DartPad to run it条在线信息.

class Object1 {
  final String date;
  final int day_data;
  const Object1({required this.date, required this.day_data});
}

class Object2 {
  final String date;
  final int night_data;
  const Object2({required this.date, required this.night_data});
}

class Object3 {
  final String date;
  final int? day_data;
  final int? night_data;
  const Object3({required this.date, this.day_data, this.night_data});
}

List<Object3> merge(List<Object1> obj1List, List<Object2> obj2List) {
  final map = <String, Object3>{};
  obj1List.forEach((obj1) =>
      map.update(
        obj1.date, 
        (obj3) => Object3(date: obj3.date, day_data: obj1.day_data, night_data: obj3.night_data),
        ifAbsent: () => Object3(date: obj1.date, day_data: obj1.day_data, night_data: null),
      ));
  
  obj2List.forEach((obj2) =>
      map.update(
        obj2.date, 
        (obj3) => Object3(date: obj3.date, day_data: obj3.day_data, night_data: obj2.night_data),
        ifAbsent: () => Object3(date: obj2.date, day_data: null, night_data: obj2.night_data),
      ));
  
  return map.values.toList()
    ..sort((a, b) => a.date.compareTo(b.date));
}


void main() {
//here is the list 1
  List<Object1> list1=[
  Object1(date:"1",day_data:12),
  Object1(date:"2",day_data:15),
  ];

  //here is the list 2
  List<Object2> list2=[
  Object2(date:"1",night_data:56),
  Object2(date:"3",night_data:80),
  ];

  List<Object3> actualList = merge(list1, list2);
  
  //expected output
  List<Object3> expectedList=[
  Object3(date:"1",day_data:12,night_data:56),
  Object3(date:"2",day_data:15,night_data:null),
  Object3(date:"3",day_data:null,night_data:80),
  ];
  
  print('Checking size...');  
  assert(actualList.length == expectedList.length);
  print('OK');
  
  print('Checking items...');
  actualList.asMap().forEach((i, actual) {
    final expected = expectedList[i];
    print('  Checking item $i...');
    assert(actual.date == expected.date);
    assert(actual.day_data == expected.day_data);
    assert(actual.night_data == expected.night_data);
    print('  OK');
  });
  print('OK');
}

Flutter相关问答推荐

如何从模型列表中生成DropdownButtonFormField?

修复容器`Text`和容器表单之间的重叠

在Flutter 动中绘制ECG图

就像Flutter 中的头文件一样?

在选项卡栏视图中搜索和筛选不起作用

如何在不注销的情况下刷新Firebase身份验证用户

如何在Flutter Webview包中触发基于URL导航的事件

使用 forLoops 在 Dart 中进行单元测试会返回 stackoverflow

在 flutter 的列中使用 Expanded 时出现渲染 Flex 错误

Dart:未捕获错误:RangeError(索引):索引超出范围:索引应小于 7:7

Flutter如何从深入嵌套的小部件中打开抽屉?

'type' Icon '不是类型' IconData '的子类型

如何修复 ICU Lexing 错误:Flutter 中的意外字符

Android Studio - Electric Eel 2022.1.1 更新 destruct 了 dart 文件图标

如何显示从 MariaDB 获取的数据到列表视图

为什么 Flutter riverpod 直接分配不起作用但方法可以

如何获取 android 和 Ios (flutter) 的 CircularProgress 指示器?

从物理设备 Flutter 中移除 USB 后启动画面不可见?

如何判断 text.contains() 是否包含多个值

http响应在Flutter 中返回307