用未知的钥匙解构地图的地图

Fra*_* C. 3 clojure

我有以下作为一个例子:

(def _t2 {:oxnard {:value-type "string" :rec-name "foo"}})
Run Code Online (Sandbox Code Playgroud)

其中:oxnard动态和未知的先验功能,包含的地图由众所周知的密钥名称组成(例如:value-type:rec-name).

我试图在不知道外部map关键字的情况下编写具有解构的函数,例如:

(defn if-foo? [ignoremapfirstkey & 
  {:keys [value-type rec-name]}] 
  (= rec-name "foo"))
Run Code Online (Sandbox Code Playgroud)

或类似的; 但是,我似乎无法绕过外部密钥名称而不为人所知.

Mic*_*zyk 5

假设您的函数作为参数传递了动态键,您可以使用它来提取内部地图,然后可以使用它来提取内部地图并解构:

(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]
  ...)
Run Code Online (Sandbox Code Playgroud)

如果关键是外部地图中总会有一个条目,您可以使用firstval提取内部地图或调用seq地图并解构:

(let [{:keys [foo bar]} (val (first outer-map))]
  ...)

(let [[[_ {:keys [foo bar]}]] (seq outer-map)]
  ...)
Run Code Online (Sandbox Code Playgroud)

在后一种情况下,(seq outer-map)将具有表单([k v])(包含一个映射条目的seq); 解构形式中的外部向量解构seq,内部向量解构地图条目,_是您不关心的关键字的占位符,{:keys [foo bar]}并对内部地图进行解构.你必须seq自己在地图上打电话,解构机器不会为你做.