如何判断List of maps中title为'A'的项的books列表是否存在指定map并添加
Dart 向指定列表项的子列表添加元素(不存在时)
问题场景
现有如下包含Map的List:
List values = [ { 'icon': FontAwesomeIcons.book, 'title': 'A', 'books': [ {'author': 'Max', 'age': 30}, {'author': 'Dani', 'age': 45} ] }, { 'icon': FontAwesomeIcons.book, 'title': 'B', 'books': [], } ];
需要找到title为'A'的项,检查其books子列表是否存在{'author': 'Steve', 'age': 28},如果不存在则将该元素添加进去,最终得到目标结果。
解决方案代码
// 定义要添加的目标元素 final targetBook = {'author': 'Steve', 'age': 28}; // 找到title为'A'的项 final itemA = values.firstWhere( (item) => item['title'] == 'A', orElse: () => {}, // 处理找不到的情况,返回空Map避免报错 ); // 检查books列表中是否存在目标元素 bool exists = itemA['books']?.any((book) => book['author'] == targetBook['author'] && book['age'] == targetBook['age'] ) ?? false; // 如果不存在则添加 if (!exists && itemA.isNotEmpty) { (itemA['books'] as List).add(targetBook); }
代码说明
- 定位目标项:使用
firstWhere方法筛选出title为'A'的Map,通过orElse设置找不到时的默认返回值,防止程序报错。 - 检查元素是否存在:由于Map是引用类型,不能直接用
contains判断,所以用any方法遍历books列表,对比每个元素的author和age是否与目标元素完全匹配。 - 添加元素:确认元素不存在且目标项有效时,将目标元素添加到
books列表中。
执行上述代码后,values就会变成期望的结果:
List values = [ { 'icon': FontAwesomeIcons.book, 'title': 'A', 'books': [ {'author': 'Max', 'age': 30}, {'author': 'Dani', 'age': 45}, {'author': 'Steve', 'age': 28} ] }, { 'icon': FontAwesomeIcons.book, 'title': 'B', 'books': [], } ];
内容的提问来源于stack exchange,提问作者Hamou Ouyaba
相关产品推荐
相关产品推荐

