Clojure 通过映射向量中的键值查找上一项
我有一个像这样的地图向量:Clojure 通过映射向量中的键值查找上一项,clojure,clojurescript,Clojure,Clojurescript,我有一个像这样的地图向量: [{:id 2 :val "v1"} {:id 5 :val "v2"} {:id 10 :val "v3"}] 现在我想在所选id之前找到一个元素。 例如:当提供id=10时,我希望接收: {:id 5 :val "v2"} 当选择id=2时,则返回nil 我是clojurescript编程新手,无法想出解决此问题的简单方法。。。请提供帮助:您可以使用分区对相邻地图进行配对,然后通过id在第二个地图上搜索匹配项: (def ms [{:id 2 :val "v1
[{:id 2 :val "v1"} {:id 5 :val "v2"} {:id 10 :val "v3"}]
现在我想在所选id之前找到一个元素。
例如:当提供id=10时,我希望接收:
{:id 5 :val "v2"}
当选择id=2时,则返回nil
我是clojurescript编程新手,无法想出解决此问题的简单方法。。。请提供帮助:您可以使用分区对相邻地图进行配对,然后通过id在第二个地图上搜索匹配项:
(def ms [{:id 2 :val "v1"} {:id 5 :val "v2"} {:id 10 :val "v3"}])
(ffirst (filter #(= 10 (:id (second %))) (partition 2 1 ms)))
可接受答案中的分区2 1数据是一个选项,但这里有两个基于滞后序列的备选方案
这一个首先构造查找表,将下一个ID映射到每个项,如果需要执行许多查找,那么这应该更有效。你甚至可以很容易地在上面绘制地图。但这种方法要求ID是唯一的
(let [data [{:id 2 :val "v1"} {:id 5 :val "v2"} {:id 10 :val "v3"}]
ids (zipmap (map :id (rest data)) data)]
[(ids 10)
ids])
; [{:id 5, :val "v2"}
; {5 {:id 2, :val "v1"}, 10 {:id 5, :val "v2"}}]
第二个生成一系列匹配文档,如果可能有多个文档,则这是必需的:
(let [data [{:id 2 :val "v1"} {:id 5 :val "v2"} {:id 10 :val "v3"}]
next-ids (->> data rest (map :id))]
(->>
(map (fn [item next-id] (if (= 10 next-id) item))
data next-ids)
(filter some?)
first))
; {:id 5, :val "v2"}
通过使用分区,您将得到类似的代码,但不是。。。您将使用destructuring:fn[first item second item]=10:id second item。实际上,这种方法非常方便