解构地图的嵌套地图 - Clojure

问题描述 投票:0回答:2

我正在研究 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})

collections clojure destructuring
2个回答
1
投票

与最初嵌套解构的方式完全相同,但更深一层。请注意我是如何使用

: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
。如果这是一个问题,您始终可以在其中一个解构中重命名事物,或者避免使用显式吸气剂的单个级别,例如
(:name my-nested-map-3)
.


0
投票

虽然原生解构就足够了,但我经常发现使用 plumbing 库更容易。

(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))
© www.soinside.com 2019 - 2024. All rights reserved.