通过地图向量中的键值查找上一个项目
Find previous item by key value in vector of maps
我有一个这样的地图向量:
[{:id 2 :val "v1"} {:id 5 :val "v2"} {:id 10 :val "v3"}]
现在我想查找所选 ID 之前的元素。
例如:当提供 id = 10 时,我想接收:
{:id 5 :val "v2"}
and when selected id = 2 then return nil.
我是 clojurescript 编程的新手,想不出这个问题的简单解决方案...请帮忙:)
您可以使用 partition
来配对相邻的地图,然后通过 id 在第二个地图上搜索匹配项:
(def ms [{:id 2 :val "v1"} {:id 5 :val "v2"} {:id 10 :val "v3"}])
(ffirst (filter #(= 10 (:id (second %))) (partition 2 1 ms)))
(partition 2 1 data)
在接受的答案中是一个选项,但这里有两个基于 "lagged" 序列的备选方案。
这个首先构造查找 table(将下一个 ID 映射到每个项目),如果需要进行许多查找,这应该会更高效。你甚至可以轻松 map
超过它。但是这种方法要求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"}
您将使用 partition
获得类似的代码,但您将使用解构而不是 #(...)
:(fn [first-item second-item] (= 10 (:id second-item)))
。实际上 ffirst 在这种方法中非常方便。
我有一个这样的地图向量:
[{:id 2 :val "v1"} {:id 5 :val "v2"} {:id 10 :val "v3"}]
现在我想查找所选 ID 之前的元素。 例如:当提供 id = 10 时,我想接收:
{:id 5 :val "v2"}
and when selected id = 2 then return nil.
我是 clojurescript 编程的新手,想不出这个问题的简单解决方案...请帮忙:)
您可以使用 partition
来配对相邻的地图,然后通过 id 在第二个地图上搜索匹配项:
(def ms [{:id 2 :val "v1"} {:id 5 :val "v2"} {:id 10 :val "v3"}])
(ffirst (filter #(= 10 (:id (second %))) (partition 2 1 ms)))
(partition 2 1 data)
在接受的答案中是一个选项,但这里有两个基于 "lagged" 序列的备选方案。
这个首先构造查找 table(将下一个 ID 映射到每个项目),如果需要进行许多查找,这应该会更高效。你甚至可以轻松 map
超过它。但是这种方法要求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"}
您将使用 partition
获得类似的代码,但您将使用解构而不是 #(...)
:(fn [first-item second-item] (= 10 (:id second-item)))
。实际上 ffirst 在这种方法中非常方便。