的载体上一个项目我有这样的地图矢量:查找键值在地图
[{:id 2 :val "v1"} {:id 5 :val "v2"} {:id 10 :val "v3"}]
,现在我想找到以前所选择的ID的元素。 例如:当与ID设置= 10我想接收:
{:id 5 :val "v2"}
和选择时ID = 2,然后返回零。
我在clojurescript规划新建的,不能认为这个问题的简单解决方案的...帮助请:)
的载体上一个项目我有这样的地图矢量:查找键值在地图
[{:id 2 :val "v1"} {:id 5 :val "v2"} {:id 10 :val "v3"}]
,现在我想找到以前所选择的ID的元素。 例如:当与ID设置= 10我想接收:
{:id 5 :val "v2"}
和选择时ID = 2,然后返回零。
我在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)
在接受的答案是一种选择,但这里是基于一种“滞后”序列两种选择。
这一个首先构造查找表(将下一个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
但不是#(...)
你得到类似的代码” d使用解构:(fn [first-item second-item] (= 10 (:id second-item)))
。事实上,ffirst在这种方法中非常方便。
不错,简短而聪明,谢谢! – Elen