Dart:获取列表 2 中元素的索引(列表 1 中的元素)

Kar*_*dts 7 dart flutter

我在 DART 中有 2 个列表

列表 1:选定的用户

[{'name': name1, id:'123'}, {'name': name1, id:'123'})]
Run Code Online (Sandbox Code Playgroud)

列表 2:所有用户

[{'name': name1, id:'123'}, {'name': name1, id:'123'}) .... (much longer)]
Run Code Online (Sandbox Code Playgroud)

我想知道LIST 1中每个选定用户在LIST 2中的索引。这可能吗?

我尝试了indexWhere方法。但我不断收到错误:

error: The method 'contains' isn't defined for the class 'Map'.
Run Code Online (Sandbox Code Playgroud)

Mar*_*arc 10

如果列表中的结构是用等号运算符重写的方式定义的对象,则可以执行以下操作:

class User {

  String name;
  String id;

  User(this.name, this.id);

 @override
 int get hashCode => name.hashCode ^ id.hashCode;

  bool operator == (o) => name == o.name && id == o.id;

  @override
  toString() {
    return "$name:$id";
  }

}

void main() {
  var list = [User("name1", "123") , User("name4", "888")];
  var list2 = [User("name1", "123") , User("name2", "234"), User("name3", "666"), User("name4", "888")];

  list.forEach((element) {
    print(list2.indexOf(element));
  });
}
Run Code Online (Sandbox Code Playgroud)

这会打印出所选用户的所有索引键(在我的例子中)。也许有一个更优雅的解决方案,但它确实有效。使用indexWhere(),您应该能够将相等比较作为函数本身内部的闭包提供,如下所示:

  list.forEach((element) {
    print(list2.indexWhere((user) => user.name == element.name && user.id == element.id));
  });
Run Code Online (Sandbox Code Playgroud)

这样,您就可以在用户类中省略运算符和哈希码覆盖。

如果您没有课程,这也应该有效:

void main() {
  var list = [{"name": "name1", "id": "123"} , {"name": "name4", "id": "888"}];
  var list2 = [{"name": "name1", "id": "123"} , {"name": "name2", "id": "234"}, {"name": "name3", "id": "666"}, {"name": "name4", "id": "888"}];

  list.forEach((element) {
    print(list2.indexWhere((innerElement) => innerElement["name"] == element["name"] && innerElement["id"] == element["id"]));
  });
}
Run Code Online (Sandbox Code Playgroud)