Clojure获取嵌套映射值

时间:2013-03-26 14:03:57

标签: clojure

所以我习惯在我的应用程序中使用嵌套数组或设置图。我尝试在Clojure中设置一个像这样:

(def gridSettings
  {:width 50
   :height 50
   :ground {:variations 25}
   :water {:variations 25}
   })

我想知道你是否知道检索嵌套值的好方法?我试着写

(:variations (:ground gridSettings))

哪个有效,但它是后缀而且相当繁琐,特别是如果我添加几个级别。

4 个答案:

答案 0 :(得分:26)

这就是get-in的作用:

(get-in gridSettings [:ground :variations])

来自docstring:

clojure.core/get-in
([m ks] [m ks not-found])
  Returns the value in a nested associative structure,
  where ks is a sequence of keys. Returns nil if the key
  is not present, or the not-found value if supplied.

答案 1 :(得分:21)

您可以使用thread-first macro

(-> gridSettings :ground :variations)

我更喜欢->而不是get-in,除了两个特殊情况:

  • 当键是在运行时确定的任意序列时。
  • 提供未找到的值很有用。

答案 2 :(得分:11)

除了其他答案(get-in->宏)之外,有时你想从地图中获取多个值(嵌套或不嵌套),在这种情况下,解构可能真的有帮助

(let [{{gv :variations} :ground
       {wv :variations} :water} gridSettings]
  [gv wv]) 

答案 3 :(得分:0)

地图是部分功能(不是全部)。因此,人们可以简单地将它们作为函数应用。基于问题的地图:

(gridSettings :ground)
;=> {:variations 25}

结果是地图。因此,它可以再次应用,这导致非常相似(但不是向后)的语法"正如问题中提出的那样:

((gridSettings :ground) :variations)
;=>25