的載體上一個項目我有這樣的地圖矢量:查找鍵值在地圖
[{: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