2015-01-21 5 views
0

(println (get-in @app-state ["my-seq"]))Clojurescript, как получить доступ к карте в индексированной последовательности

Возвращает следующую последовательность с типом 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

ответ

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, чтобы найти вашу запись.

Если порядок не имеет значения, я рекомендую хранить данные в виде карты в первую очередь:

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

Я имел карту и сделал '(сортировка по последним {карта}) ', который возвратил' cljs.core/IndexedSeq', я пытаюсь (get-in @ app-state ["my-seq": by-uid uid]) ', но он возвращает нуль. –

+0

Мое второе предложение должно работать тогда - в основном: '(сначала (сначала фильтр (comp # {uid}) (get @ app-state« my-seq »)))'. Но я рекомендую хранить ваши данные в соответствии с их использованием, например. если вам нужен поиск по UID, сохраните его как карту, но если вам нужно получить к нему доступ в порядке, используйте seq. Если вам нужны оба варианта, используйте оба представления (это было первым предложением в моем ответе). – xsc