Dart:在列表中查找和调整Map的更简单方法

4

我有以下用户列表和地图

user = [
   {'user': 'John', 'id': 'aaa'},
   {'user': 'Jane', 'id': 'aa1'},
];

我想找到Jane并将她的ID更改为'aa3'。目前,我正在搜索user[]中的index。然后使用该索引来更新id的值。

   int i =  user.indexWhere((e) => e.name == 'Jane');
   user[i]['id'] = 'aa1';

有没有一种方法可以一次性完成这个操作?看起来现在的方式非常低效,但我还没有找到更好的方法。


2
这个程序效率低下是因为你选择了低效的数据结构。如果用户名是唯一的,那么使用一个将用户名映射到对应User对象的Map<String, User>会更直接和高效。 - jamesdlin
我有些困惑。你是在建议将泛型添加到列表中吗? - chichi
1
不,我的建议是你用Map<String, User>替换你的List<Map<...>> - jamesdlin
哦,我现在明白了。像{'Jane': User-Attr-of-Jane, 'John': ---}这样。由于名称不重复,我可以使用Map而不需要找到索引来进行调整。有趣的想法。我一直将数据作为列表获取。没想到可以这样做。 - chichi
2个回答

4

这完全取决于您需要解决方案的“性能”如何。如果我是您,我会首先查看将数据解析为其自己的 Person 类。让我们看一个例子:

@immutable
class Person {
  final String id;
  final String name;
  const Person({
    required this.id,
    required this.name,
  });

  @override
  bool operator ==(covariant Person other) => id == other.id;

  @override
  int get hashCode => id.hashCode;
}

这里我覆盖了 == 运算符,使得具有相同 id 的两个 Person 实例被视为相等。在您覆盖此运算符后,建议您也要覆盖 hashCode getter,并用于在 Map<T, E> 中查找对象实例。

然后,我会将这些 Person 实例放入 Map<String, Person>中,其中映射中的 String 键将是 Person 实例的ID,如下所示:

final persons = const {
  'aaa': Person(id: 'aaa', name: 'John'),
  'aa1': Person(id: 'aa1', name: 'Jane'),
};

完成这些步骤后,您可以轻松地像这样找到您的对象:

final aaa = persons['aaa'];
final aa1 = persons['aa1'];

1

遍历用户列表,同时检查相应的用户,当找到一个时,更改其ID并从循环中退出。

尝试这个:

  for(int i =0;i<user.length;i++)
  {
    var single_user=user[i];
    if(single_user['user']=='Jane'){
      single_user['id']="aa3";
      //or any changes as you want
      break;
    }
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接