解构映射的嵌套映射- Clojure



我正在学习Clojure中的解构。我学到了一点,现在我可以解构两层嵌套的地图了。我如何解构最深的嵌套映射?我在这里留下了一个我试图重构的示例地图。你能给我展示一些简单易懂的例子,告诉我如何解构嵌套映射吗?


(def my-nested-map-2 {:id 1 :name {:first "ali" :last "veli"}})
(let [{id :id {first :first, last :last} :name} my-nested-map-2]
(println id first last))

;==>this map I would like to destructure.
(def my-nested-map-3 {:id 1 :name {:first "ali" :last "veli"} :surname {:snf "foo" :snl "bar" :location {:country "usa"}} :age 26})

与您最初嵌套解构的方式完全相同,但更深一层。注意我是如何使用:keys来避免重复名称的:

(let [{:keys
[id age]

{:keys [first last]}
:name
{:keys [snf snl], {:keys [country]} :location}
:surname}
my-nested-map-3]
...)

但请注意,我还在顶部添加了相当多的格式,使其易于理解。嵌套解构通常会让事情变得更加混乱。例如,注意这段代码有多简洁,它只有一个层次的析构:

(let [{:keys [id name surname age]} my-nested-map-3
{:keys [first last]} name
{:keys [snf snl location]} surname
;; Why is `location` under `:surname` in the first place?
{:keys [location]} surname]
...)

在这种特殊情况下,唯一的缺点是它给局部作用域带来了比需要更多的名称,甚至使内置的name黯然失色。如果这是一个问题,您总是可以在其中一个解构中重命名事物,或者避免使用显式getter的单个级别,如(:name my-nested-map-3)

虽然本地解构已经足够了,但我经常发现使用管道库更容易。

(use '[plumbing.core])
(let [data {:id 1 :name {:first "ali" :last "veli"}
:surname {:snf "foo" :snl "bar" :location {:country "usa"}}
:age     26}]
(letk [[id name surname] data
[first last] name
[snf snl location] surname
[country] location]
country))

相关内容

  • 没有找到相关文章

最新更新