如何在Dart的List<Map>中根据id替换指定元素的time值?
修改Dart列表中指定元素的字段值
嘿,这事儿其实挺简单的,我给你分享几种实用的实现方式,你可以根据自己的场景来选:
方法一:遍历列表直接修改(最直观)
这种方式适合你的当前场景,因为Dart里的Map是引用类型,遍历的时候直接修改字段就会同步到原列表里:
void main() { List<Map<String, dynamic>> products = [ {'id': 24, 'time': '2019-11-24 00:00:00.000'}, {'id': 36, 'time': '2019-11-23 00:00:00.000'}, {'id': 48, 'time': '2019-11-24 00:00:00.000'}, ]; // 遍历列表,匹配到id为48的元素就修改time字段 products.forEach((product) { if (product['id'] == 48) { product['time'] = '2019-10-26 00:00:00.000'; } }); // 打印验证结果 print(products); }
方法二:通过索引定位修改(更灵活)
如果之后还需要用到这个元素的位置,或者想避免遍历整个列表(虽然数据量小的时候差别不大),可以先找到元素的索引再修改,还能加个判断避免找不到元素时报错:
void main() { List<Map<String, dynamic>> products = [ {'id': 24, 'time': '2019-11-24 00:00:00.000'}, {'id': 36, 'time': '2019-11-23 00:00:00.000'}, {'id': 48, 'time': '2019-11-24 00:00:00.000'}, ]; // 找到第一个id为48的元素的索引 int targetIndex = products.indexWhere((product) => product['id'] == 48); // 检查索引有效(找不到元素时indexWhere返回-1) if (targetIndex != -1) { products[targetIndex]['time'] = '2019-10-26 00:00:00.000'; } print(products); }
方法三:生成新列表(适合不可变数据场景)
如果你的列表是不可变的(比如用List.unmodifiable创建的),或者想保留原数据不变,就用map生成一个新列表,注意这里要创建新的Map避免修改原数据:
void main() { List<Map<String, dynamic>> products = [ {'id': 24, 'time': '2019-11-24 00:00:00.000'}, {'id': 36, 'time': '2019-11-23 00:00:00.000'}, {'id': 48, 'time': '2019-11-24 00:00:00.000'}, ]; // 生成新列表,仅修改目标元素的time字段 List<Map<String, dynamic>> updatedProducts = products.map((product) { if (product['id'] == 48) { // 展开原Map并替换time字段,创建新Map return {...product, 'time': '2019-10-26 00:00:00.000'}; } return product; }).toList(); print(updatedProducts); }
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

