首页 > 解决方案 > 浏览 dart 中的嵌套字典

问题描述

在飞镖我有一个嵌套的元素列表

void main() {
  
  var diction = <String, dynamic>{'1':'Alpha','2':'Beta','3':{'x':'Football','y':'Golf'},'4':{'a':'Samba','b':'Tango','c':'FoxTrott','d':'Waltz'}};
}

以及引导您浏览字典的键列表,例如

var keyList = ['4','a']

问题是,我不能只使用

diction['4','a']

但必须使用

diction['4']['a']

我怎样才能像最后一种情况一样调用字典?

标签: flutterdart

解决方案


operator []只接受一个参数。那是语言的语法,你不能改变它。

可能的行动:

  • 没做什么。只需使用dict[key1][key2]并忍受它。我不清楚类似的东西dict[key1, key2]是否会带来任何真正的改进。

  • 直接构造以LinkedHashMapaList为 key 的 a。您需要提供equalshashCode回调,因为List相等通常基于对象身份并且不执行深度相等检查。(同样,通常每个List实例都有一个不同的hashCode.)当这一切都完成后,你可以使用dict[[key1, key2]]. 请注意,使用这种方法,您可能会拥有可变数量的键。

  • 使用package:tuple并使用 aTuple2作为键。然后你可以使用dict[Tuple2(key1, key2)]. 由于元组是“值”类型并实现operator ==and hashCode,因此您可以Tuple2直接使用而无需做额外的工作。

  • 派生您自己Map的基于类。您可能希望从package:collectionDelegatingMap类派生,该类将为您提供大部分实现。从那里您可以添加自己的方法,这些方法采用多个键并在内部执行嵌套查找。如果您添加一个call(Key1 key1, Key2 key2)方法,您的自定义实例Map将成为类似函数的对象,然后您的调用者可以使用它dict(key1, key2)来执行查找。请注意,您将无法Map使用相同的语法在自定义中设置项目。call()或者,您可以添加get(Key1 key1, Key2 key2)set(Key1 key1, Key2 key2, Value value)方法来代替使用。


推荐阅读