嵌套地图和向量中的 ClojureScript 搜索
ClojureScript search in nested map and vector
我有一个 edn,其中嵌套了地图。我找到了一个很好的例子 Clojure: a function that search for a val in a nested hashmap and returns the sequence of keys in which the val is contained
(def coll
{:a "aa"
:b {:d "dd"
:e {:f {:h "hh"
:i "ii"}
:g "hh"}}
:c "cc"})
有了这个答案
(defn find-in [coll x]
(some
(fn [[k v]]
(cond (= v x) [k]
(map? v) (if-let [r (find-in v x)]
(into [k] r))))
coll))
我的问题是,由于 some
,我无法获得每个结果的路径,只能获得第一个逻辑真理。我尝试了 map
和 keep
但它们破坏了递归。我怎样才能让这段代码返回所有结果的路径,而不仅仅是第一个?感谢任何帮助。
filter
给出所有的结果,其中 some
只会给你第一个结果,或者 nil
如果没有任何结果。通常可以通过过滤然后取第一个来解决相同的问题,而不是使用 some
。
您可以使用辅助函数将嵌套映射转换为具有完全限定键的平面映射。然后查找可以只过滤值和 returns 匹配的键。
(defn flatten-map [path m]
(if (map? m)
(mapcat (fn [[k v]] (flatten-map (conj path k) v)) m)
[[path m]]))
(defn find-in [coll x]
(->> (flatten-map [] coll)
(filter (fn [[_ v]] (= v x)))
(map first)))
你的样本:
(find-in coll "hh")
=>
([:b :e :f :h] [:b :e :g])
我有一个 edn,其中嵌套了地图。我找到了一个很好的例子 Clojure: a function that search for a val in a nested hashmap and returns the sequence of keys in which the val is contained
(def coll
{:a "aa"
:b {:d "dd"
:e {:f {:h "hh"
:i "ii"}
:g "hh"}}
:c "cc"})
有了这个答案
(defn find-in [coll x]
(some
(fn [[k v]]
(cond (= v x) [k]
(map? v) (if-let [r (find-in v x)]
(into [k] r))))
coll))
我的问题是,由于 some
,我无法获得每个结果的路径,只能获得第一个逻辑真理。我尝试了 map
和 keep
但它们破坏了递归。我怎样才能让这段代码返回所有结果的路径,而不仅仅是第一个?感谢任何帮助。
filter
给出所有的结果,其中 some
只会给你第一个结果,或者 nil
如果没有任何结果。通常可以通过过滤然后取第一个来解决相同的问题,而不是使用 some
。
您可以使用辅助函数将嵌套映射转换为具有完全限定键的平面映射。然后查找可以只过滤值和 returns 匹配的键。
(defn flatten-map [path m]
(if (map? m)
(mapcat (fn [[k v]] (flatten-map (conj path k) v)) m)
[[path m]]))
(defn find-in [coll x]
(->> (flatten-map [] coll)
(filter (fn [[_ v]] (= v x)))
(map first)))
你的样本:
(find-in coll "hh")
=>
([:b :e :f :h] [:b :e :g])