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

Flutter/Dart技术咨询:如何检查列表中是否存在指定键值以避免重复添加对象

嗨,很高兴能帮到你!先说说你现有代码里的问题:首先初始时organizedCart是空数组,直接访问organizedCart[0]会抛出RangeError;其次Map的contains()方法是用来检查是否包含指定键的,你用它来判断字符串是否存在,逻辑完全不对。

下面给你几种正确的实现方式,从易理解到高效优化都有:

方法1:直观循环检查(适合新手理解)

通过嵌套循环遍历organizedCart,逐个对比name是否存在:

var organizedCart = [];
for (var store in example) {
  bool isExist = false;
  // 遍历已添加的商店,检查name是否重复
  for (var item in organizedCart) {
    if (item['name'] == store['name']) {
      isExist = true;
      break;
    }
  }
  if (!isExist) {
    organizedCart.add({
      "name": store['name'],
      "products": [],
    });
  }
}

方法2:用Dart高阶函数简化代码

利用List的any()方法,可以一行判断是否存在匹配元素,代码更简洁:

var organizedCart = [];
for (var store in example) {
  // any()会遍历列表,只要有一个元素满足条件就返回true
  bool isExist = organizedCart.any((item) => item['name'] == store['name']);
  if (!isExist) {
    organizedCart.add({
      "name": store['name'],
      "products": [],
    });
  }
}

方法3:高效去重(适合大数据量场景)

如果你的数据量很大,用Set存储已存在的name可以把存在性检查的时间复杂度降到O(1),效率更高:

var existingNames = <String>{}; // 用Set存储已有的name,避免重复
var organizedCart = [];
for (var store in example) {
  var name = store['name'] as String;
  if (!existingNames.contains(name)) {
    existingNames.add(name);
    organizedCart.add({
      "name": name,
      "products": [],
    });
  }
}

进阶建议:使用强类型Model(Flutter开发推荐)

在Flutter里尽量避免直接用Map,定义一个Store类可以让代码更健壮,避免类型错误:

// 定义Store模型类
class Store {
  final String name;
  List products;

  Store({required this.name, this.products = const []});
}

// 使用示例
var example = [
  Store(name: "Store1"),
  Store(name: "Store2"),
  Store(name: "Store3"),
  Store(name: "Store4"),
];

var existingNames = <String>{};
var organizedCart = <Store>[];
for (var store in example) {
  if (!existingNames.contains(store.name)) {
    existingNames.add(store.name);
    organizedCart.add(Store(name: store.name, products: []));
  }
}

内容的提问来源于stack exchange,提问作者Koala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 14:32:37