【问题标题】:Flutter: Check if key exist in list of [{"key": "value"}]Flutter:检查[{“key”:“value”}]列表中是否存在键
【发布时间】:2021-07-23 00:24:00
【问题描述】:

您好 1 个月了,还在学习 Dart/Flutter,有什么方法可以检查 [{"key": "value"}] 中是否存在“key”? 我来自Javascript和python环境所以我真的不知道这个东西叫什么我只知道它是一种列表

这是我的 JSON

var example = [
  {
    "name": "Store1",
    "products": []
  },
  {
    "name": "Store2",
    "products": []
  },
  {
    "name": "Store3",
    "products": []
  },
  {
    "name": "Store4",
    "products": []
  }
]

所以我尝试像这样访问它

var organizedCart = [];
for (var i = 0; i < example.length; i++) {
  if (!organizedCart[0].contains(example[i]['name'])) {
    organizedCart.add(
      {
        "name": "${example[i]['name']}",
        "products": [],
      },
    );
  }
}

条件的目标是避免添加现有的“名称”, 因此,如果organizedCart 不包含给定的条件,基本上我想在列表中添加一个{}

提前致谢!

demo

【问题讨论】:

  • 你现在得到了什么结果?
  • 未捕获错误:RangeError(索引):索引超出范围:没有有效索引:0

标签: list flutter dictionary dart


【解决方案1】:

尝试将您的 for 循环更改为 for (var i = 0; i &lt; example.length - 1; i++) {

休息似乎是正确的。

【讨论】:

    【解决方案2】:

    您可以使用Set 代替List。如果您使用LinkedHashSet,您可以定义应该被视为相等元素的内容。

    然后我们可以将所有元素添加到这个新的LinkedHashSet,这将自动确保以这样一种方式添加元素,如果我们的Set 尚未包含@987654330,我们只会添加Map @ 具有相同的 name 值。

    import 'dart:collection';
    
    void main() {
      final example = [
        {"name": "Store1", "products": <Object>[]},
        {"name": "Store2", "products": <Object>[]},
        {"name": "Store2", "products": <Object>[]},
        {"name": "Store3", "products": <Object>[]},
        {"name": "Store4", "products": <Object>[]},
        {"name": "Store4", "products": <Object>[]}
      ];
    
      final organizedCart = (LinkedHashSet<Map<String, Object>>(
              equals: (a, b) => a['name'] == b['name'],
              hashCode: (o) => o['name'].hashCode)
            ..addAll(example))
          .toList();
    
      print(organizedCart);
      // [{name: Store1, products: []}, {name: Store2, products: []},
      // {name: Store3, products: []}, {name: Store4, products: []}]
    }
    

    我应该注意,您应该正确地停止使用 Map 作为对象,而是实际定义一个名为例如的类。 Store 具有字段 nameproducts。通过这样做,我们可以在此处添加比较逻辑,并使解决方案更加类型安全。

    我知道 JavaScript 开发人员真的很喜欢在任何事情上都使用 Map,但这确实是一种糟糕的行为;)

    更新:

    这是一个使用 Store 类的示例,但我们使用与 Set 相同的技巧:

    class Store {
      final String name;
      final List<Object> products;
    
      Store({required this.name, required this.products});
    
      @override
      bool operator ==(Object other) => other is Store && other.name == name;
    
      @override
      int get hashCode => name.hashCode;
    
      @override
      String toString() => '$name have these products: $products';
    }
    
    void main() {
      final example = [
        Store(name: 'Store1', products: []),
        Store(name: 'Store2', products: []),
        Store(name: 'Store2', products: []),
        Store(name: 'Store3', products: []),
        Store(name: 'Store4', products: []),
        Store(name: 'Store4', products: []),
      ];
    
      final organizedCart = {...example}.toList();
    
      print(organizedCart);
      // [Store1 have these products: [], Store2 have these products: [],
      // Store3 have these products: [], Store4 have these products: []]
    }
    

    由于我们的Store 实现了自己的==hashCode,我们可以只使用do {...example} 来创建一个新的Set,我们在其中添加来自example 的所有Store 对象。

    【讨论】:

    • 嘿,谢谢!仍在学习飞镖和地图对我来说真的很困惑......而且我找不到一个很好的飞镖地图/列表教程的来源,它可以从头开始解决所有问题......无论如何,谢谢!
    • Map 应该用于定义了keyvalue 的类型。当您的Map 中开始有多种类型的value(或key)时,您确实做错了,应该考虑改用class。问题是,如果你 Map 包含多种类型,Dart 分析器无法帮助你静态地查找类型错误,因此你有运行时错误的风险。
    • 谢谢,我会想办法从头开始研究这个的 :)) 上帝保佑
    猜你喜欢
    • 1970-01-01
    • 2013-08-07
    • 2023-02-07
    • 2017-02-16
    • 2014-09-25
    • 2012-06-15
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多