flutter 我怎样才能更新列表中所有== true的项到给定的条件

35g0bw71  于 2023-05-29  发布在  Flutter
关注(0)|答案(3)|浏览(139)

我有以下列表

List myList = [
{'name':'Alex'},
{'name':'Ali'},
{'name':'jack'},
{'name':'Alex'},
{'name':'Alex'},
];

现在我想更新所有项目的名称== '亚历克斯'到'安迪'
所以我尝试了以下方法

int wantedIndex =  myList.indexWhere((element) =>  element['name']=='Alex');
  myList[wantedIndex] = {'name':'Andy'} ;

因为indexWhere只获取第一个目标索引,所以它只会更新一个项。
那么我如何才能实现这一点与所有项目== '亚历克斯'?

cigdeys3

cigdeys31#

一个简单的for-in循环就足够了:

for (var map in myList) {
  if (map['name'] == 'Alex') {
    map['name'] = 'Andy';
  }
}

根据您的评论,您对代码如何通过局部变量改变myList的元素感到困惑。

+-----+-----+-----+-----
myList --> |  o  |  o  |  o  | ... 
           +--|--+--|--+--|--+-----
              |     |     |
              |     |     +---------------+
              |     +-----------+         |
              v                 |         v
          {'name': 'Alex'}      |     {'name': 'jack'}
              ^                 v
              |             {'name': 'Ali'}
      map ----+

所有变量都是对对象的引用。myList是对List对象的引用,该对象内部存储了对Map对象的引用数组。在遍历myList时,循环的局部map变量将引用这些相同的Map对象。(请注意,不会复制任何对象。Dart没有copy构造函数,因此不能创建任意对象的副本。)
如果你将这个局部变量map重新分配给其他对象,那么这只会使map引用其他对象,而不会影响myList或它的任何元素。但是,通过map(例如Map.operator []=)调用 mutators 会改变所引用的Map对象,这些对象与list元素所引用的对象相同。
标签:What is the true meaning of pass-by-reference in modern languages like Dart?

snvhrwxg

snvhrwxg2#

你可以使用map方法。

myList.map((item) {
  if (item['name'] == 'Alex') item['name'] = 'Andy';
}).toList();

print(myList); // [{name: Andy}, {name: Ali}, {name: jack}, {name: Andy}, {name: Andy}]
x7yiwoj4

x7yiwoj43#

我们得小心一点。你的密码

int wantedIndex =  myList.indexWhere((element) =>  element['name']=='Alex');
myList[wantedIndex] = {'name':'Andy'} ;

实际上是 * 替换 * 任何Map与关键字“名称”设置为“亚历克斯”与 * 新 * Map与关键字“名称”设置为“安迪”。假设原始数据是{'name': 'Alex', 'age': 'ten'},您的代码将用{'name': 'Andy'}替换它,并且“年龄”数据将丢失。这可能重要,也可能无关紧要,取决于上下文。此外,您的代码假设列表中有这样一个元素;如果没有,则indexWhere返回-1,这可能是一个问题。
对于这种类型的问题,使用递归解决方案通常很有帮助。例如,使用您在文章中使用的逻辑:

void update(List<Map<String, String>> data) {
  final index = data.indexWhere((element) => element["name"] == "Alex");
  if (index != -1) update(data..[index]["name"] = "Andy");
}

(请注意,如果数据中还有其他键值对,它们不会丢失,如果没有匹配,索引也没有问题。
然后我们可以这样做:

update(myList);

相关问题