Data structures Clojurescript,如何访问索引序列中的映射

Data structures Clojurescript,如何访问索引序列中的映射,data-structures,clojure,sequence,clojurescript,seq,Data Structures,Clojure,Sequence,Clojurescript,Seq,(println(进入@app state[“我的序列]) 返回以下序列,类型为cljs.core/IndexedSeq ([-Jg95JpA3_N3ejztiBBM {create_date 1421803605375, website "www.example.com", first_name "one"}] [-Jg95LjI7YWiWE233eK1 {create_date 1421803613191, website "www.example.com", first_na

(println(进入@app state[“我的序列])

返回以下序列,类型为
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

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

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

    (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]))
    
    这具有最佳的查找性能,但将使用更多内存,并使代码稍微复杂一点

  • 在seq中搜索条目:

    (defn entry-by-uid
      [uid]
      (->> (get @app-state "my-seq")
           (filter (comp #{uid} first))
           (first)))
    
    在最坏的情况下,必须遍历整个seq才能找到您的条目

  • 如果顺序不重要,我建议首先将数据存储为地图:

    (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]))
    

    我有一个映射,然后做了一个
    (按最后一个{map}排序)
    ,它返回了一个
    cljs.core/IndexedSeq
    我正在尝试
    (进入@app state[“my seq”:按uid uid-uid])
    ,但它返回了nil。我的第二个建议基本上应该有效:
    (首先(过滤(comp uid}first)(获取@app state“my seq”)
    。但我建议您根据数据的用途存储数据,例如,如果需要按UID查找,请将其存储为映射,但如果需要访问它,请使用seq。如果两者都需要,请使用两种表示法(这是我回答中的第一个建议)。