【问题标题】:Clojurescript, how to access a map within a indexed sequenceClojurescript,如何访问索引序列中的地图
【发布时间】:2015-01-21 08:21:06
【问题描述】:

(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

【问题讨论】:

    标签: data-structures clojure sequence clojurescript seq


    【解决方案1】:

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

    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 才能找到您的条目。

    如果顺序无关紧要,我建议首先将数据存储为地图:

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

    【讨论】:

    • 我有一张地图,并做了一个(sort-by last {map}),它返回了一个cljs.core/IndexedSeq 我正在尝试(get-in @app-state ["my-seq" :by-uid uid]),但它返回nil。
    • 我的第二个建议应该会起作用 - 基本上是:(first (filter (comp #{uid} first) (get @app-state "my-seq")))。但我建议您根据使用情况存储数据,例如如果您需要通过 UID 查找,请将其存储为地图,但如果您需要按顺序访问它,请使用 seq。如果两者都需要,请同时使用两种表示形式(这是我回答中的第一个建议)。
    猜你喜欢
    • 2021-11-05
    • 1970-01-01
    • 2021-02-07
    • 2021-07-04
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多