我有以下列表
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
只获取第一个目标索引,所以它只会更新一个项。
那么我如何才能实现这一点与所有项目== '亚历克斯'?
3条答案
按热度按时间cigdeys31#
一个简单的
for
-in
循环就足够了:根据您的评论,您对代码如何通过局部变量改变
myList
的元素感到困惑。所有变量都是对对象的引用。
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?
snvhrwxg2#
你可以使用
map
方法。x7yiwoj43#
我们得小心一点。你的密码
实际上是 * 替换 * 任何Map与关键字“名称”设置为“亚历克斯”与 * 新 * Map与关键字“名称”设置为“安迪”。假设原始数据是
{'name': 'Alex', 'age': 'ten'}
,您的代码将用{'name': 'Andy'}
替换它,并且“年龄”数据将丢失。这可能重要,也可能无关紧要,取决于上下文。此外,您的代码假设列表中有这样一个元素;如果没有,则indexWhere
返回-1
,这可能是一个问题。对于这种类型的问题,使用递归解决方案通常很有帮助。例如,使用您在文章中使用的逻辑:
(请注意,如果数据中还有其他键值对,它们不会丢失,如果没有匹配,索引也没有问题。
然后我们可以这样做: