You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断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);
}

代码说明

  1. 定位目标项:使用firstWhere方法筛选出title为'A'的Map,通过orElse设置找不到时的默认返回值,防止程序报错。
  2. 检查元素是否存在:由于Map是引用类型,不能直接用contains判断,所以用any方法遍历books列表,对比每个元素的author和age是否与目标元素完全匹配。
  3. 添加元素:确认元素不存在且目标项有效时,将目标元素添加到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 05:10:54