首页 > 解决方案 > forEach 没有预期的过滤

问题描述

所以我试图过滤一个包含一些对象的普通列表。在这些对象中是一个 ID,应该只显示一次。我的问题是这不起作用。当我尝试只输出单个 ID 时,它可以工作:

List container = [];

haltepunkte.forEach((element) {
  if (!container.contains(element["LineID"])) {
    print(element['LineID']);
    container.add(element);
  }
});

当我在容器上调用 print 时,这会再次输出我的整个列表。

[{StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 101}, {StopID: 130, StopText: Seegasse, LineID: 136}, {StopID: 130, StopText: Seegasse, LineID: 136}, {StopID: 130, StopText: Seegasse, LineID: 136}]

但是现在,我只需将“LineID”添加到列表中并返回 ID,现在它就可以工作了:

List container = [];

haltepunkte.forEach((element) {
  if (!container.contains(element["LineID"])) {
    print(element['LineID']);
    container.add(element['LineID']);
  }
});
[101, 136, 538, 611]

有谁知道为什么会这样?我的目标是取回一个列表,其中每个 LineID 只存在一次。

标签: dart

解决方案


原因是你的if说法:

if (!container.contains(element["LineID"])) {

您正在检查列表是否已经包含相同的LineID值。但是,如果您将整个元素放入列表中,例如container.add(element);列表不再包含值,element["LineID"]而是整个Map元素。

contains方法不检查是否可以在Map列表中的对象内找到值。它只检查它是否可以找到属于==另一个对象的任何对象。

更新

一种解决方案是使用 aMap来保存 LineID 和元素之间的关系,并使用它来检查您是否已经拥有该元素。然后您可以通过获取地图的值来提取所有元素:

void main() {
  final containerMap = <String, Map>{};

  final haltepunkte = [
    {'LineID': 5, 'txt': 'test'},
    {'LineID': 6, 'txt': 'more tests'}
  ];

  haltepunkte.forEach((element) {
    if (!containerMap.containsKey(element["LineID"])) {
      print(element['LineID']);
      containerMap[element["LineID"]] = element;
    }
  });
  
  final container = [...containerMap.values];
}

推荐阅读