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
相关产品推荐
相关产品推荐

