我以以下为例:
(def _t2 {:oxnard {:value-type "string" :rec-name "foo"}})
其中
:oxnard
是 动态和未知的先验函数 并且包含的映射由众所周知的键名组成(例如 :value-type
和 :rec-name
)。我试图在不知道外层 map 关键字的情况下编写一个带有解构的函数,例如:
(defn if-foo? [ignoremapfirstkey &
{:keys [value-type rec-name]}]
(= rec-name "foo"))
或类似的;但是,我似乎无法绕过不为人知的外键名称。
最佳答案
假设您的函数通过动态键作为参数传递,您可以使用它来提取内部映射,然后可以使用它来提取内部映射并解构:
(let [{:keys [foo bar]} (get outer-map :inner-key)]
...)
;; k could be a function argument or Var rather than a let local
(let [k :inner-key
{k {:keys [foo bar]}} outer-map]
...)
如果重点是外层映射中总是只有一个条目,您可以使用
first
和 val
来提取内层映射或在映射上调用 seq
并解构:(let [{:keys [foo bar]} (val (first outer-map))]
...)
(let [[[_ {:keys [foo bar]}]] (seq outer-map)]
...)
在后一种情况下,
(seq outer-map)
的形式为 ([k v])
(一个包含一个映射条目的序列);解构形式中的外部向量解构 seq,内部向量解构映射条目,_
是您不关心的键的占位符,{:keys [foo bar]}
解构内部映射。您必须自己在 map 上调用 seq
,解构机制不会为您执行此操作。关于clojure - 具有未知键的 map 解构图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21666636/