Clojurescript,如何在索引序列中访问地图

时间:2015-01-21 08:21:06

标签: data-structures clojure sequence clojurescript seq

(println (get-in @app-state ["my-seq"]))

返回类型为cljs.core/IndexedSeq

的以下序列
([-Jg95JpA3_N3ejztiBBM {create_date 1421803605375, 
  website "www.example.com", first_name "one"}]
 [-Jg95LjI7YWiWE233eK1 {create_date 1421803613191, 
  website "www.example.com", first_name "two"}] 
 [-Jg95MwOBXxOuHyMJDlI {create_date 1421803618124,     
  website "www.example.com", first_name "three"}])

如何通过uid访问序列中的地图?例如,属于
的地图  -Jg95LjI7YWiWE233eK1

1 个答案:

答案 0 :(得分:2)

如果您需要数据的顺序,您有以下可能性:

  1. 按顺序存储一次数据,一次存储为地图。因此,在添加新条目时,请执行以下操作:

    (defn add-entry
      [uid data]
      (swap! app-state update-in ["my-seq"]
             #(-> %
                  (update-in [:sorted] conj data)
                  (update-in [:by-uid] assoc uid data))))
    

    查找函数为:

    (defn sorted-entries
      []
      (get-in @app-state ["my-seq" :sorted]))
    
    (defn entry-by-uid
      [uid]
      (get-in @app-state ["my-seq" :by-uid uid]))
    

    这具有最佳的查找性能,但会占用更多内存并使代码更复杂。

  2. 搜索seq中的条目:

    (defn entry-by-uid
      [uid]
      (->> (get @app-state "my-seq")
           (filter (comp #{uid} first))
           (first)))
    

    在最坏的情况下,这必须遍历整个seq才能找到你的参赛作品。

  3. 如果订单无关紧要,我建议首先将数据存储为地图:

    (defn add-entry
      [uid data]
      (swap! app-state assoc-in ["my-seq" uid] data))
    
    (defn entry-by-uid
      [uid]
      (get-in @app-state ["my-seq" uid]))