【问题标题】:How to get elements that doesn't exist in a list in Dart?如何获取 Dart 列表中不存在的元素?
【发布时间】:2020-03-23 23:12:06
【问题描述】:

我想过滤列表 A 中不存在于列表 B 中的所有对象。如何在 Dart 中执行此操作?

List<MyModel> A = await _repository.myAPI();
List<MyModel> B = await _repository.myAPI();
List<FavoriteM> C = A.take(2).toList();
A.removeWhere((MyModel elem) => B.contains(elem)); // this Doesn't work
A.removeWhere((MyModel elem) => C.contains(elem)); // this works because List C are made from A;

这里的问题是列表 A 和 B 是不同的实例,即使它们都是同一个类的实例,但 Dart 仍然认为它们是不同的。 我的最终目标是:

List<MyModel> A = [obj1, obj2, obj3, obj4];
List<MyModel> B = [obj1, obj3];
A = [obj2, obj4]; // i want List A to have only the elements that doesn't exist in List B

我如何做到这一点?

【问题讨论】:

  • 您的意思是A.removeWhere(...)?目前尚不清楚为什么这不起作用。列表AB 当然是不同的实例(否则A 中不存在于B 中的所有对象将是空列表)。你的意思是 elements 都是唯一的实例吗?如果是这样,则覆盖MyModel.operator ==
  • @jamesdlin 是的,我的意思是A.removeWhere(...) 我编辑了我的问题。我怎样才能覆盖MyModel.operator ==

标签: flutter dart


【解决方案1】:

不确定这是否能解决您遇到的不同实例问题,但如果列表中的对象是字符串,那么这是一个使用集合的简单解决方案:

void main() {
  Set<String> A = {"obj1", "obj2", "obj3", "obj4"};
  Set<String> B = {"obj1", "obj3"};

  print(A.difference(B)); // prints {obj2, obj4}
}

您需要将列表转换为集合,然后再返回...或者首先使用集合。

我自己无法进一步测试,但希望对您有所帮助。

【讨论】:

    【解决方案2】:

    您绝对可以使用覆盖 == 运算符广告 @jamesdlin 在他的评论中建议。

    我想介绍equatable 包,它为我们提供了覆盖 == 运算符的广告,因为我们不必担心哈希码。

    您只需扩展 Equatable 并将所有变量传递给 props,如下代码所示。

    class Person extends Equatable {
      final String name;
    
      Person(this.name);
    
      @override
      List<Object> get props => [name];
    }
    

    现在您可以与对象进行比较,这样您的代码就可以工作了。

    注意:如果您使用的是 json,请仔细检查 equatable 包并相应地更改您的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      相关资源
      最近更新 更多