簡體   English   中英

Clojure獲取嵌套映射值

[英]Clojure get nested map value

所以我習慣在我的應用程序中使用嵌套數組或設置圖。 我嘗試在Clojure中設置一個像這樣:

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

我想知道你是否知道檢索嵌套值的好方法? 我試着寫作

(:variations (:ground gridSettings))

哪個有效,但它是后綴並且相當繁瑣,特別是如果我添加幾個級別。

這就是get-in作用:

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

從文檔字符串:

 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. 

您可以使用線程優先宏

(-> gridSettings :ground :variations)

除了兩個特殊情況之外,我更喜歡-> over get-in over

  • 當鍵是在運行時確定的任意序列時。
  • 提供未找到的值很有用。

除了提到的其他答案( get-in-> macro)之外,有時你想從地圖中獲取多個值(嵌套或不嵌套),在這些情況下,解構可能真的很有幫助

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

地圖是部分功能(不是全部)。 因此,人們可以簡單地將它們作為函數應用。 根據問題的地圖:

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

結果是一張地圖。 因此,它可以再次應用,從而產生與問題中提出的非常相似(但不是向后)的“語法”:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM