Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 通过映射向量中的键值查找上一项_Clojure_Clojurescript - Fatal编程技术网

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。实际上,这种方法非常方便