2015-02-06 10 views
0

에 중첩 구조를 업데이트 :내가이 같은 구조를 가지고 Clojure의

[["/1417612109-first-migration.clj" {:applied true :date-applied 1423233980}] 
["/1417612450-second-migration.clj" {:applied false}] 
["/1417615919-forth-migration.clj" {:applied false}]] 

나는 결국 그것을 조작하고 그것의 새 버전을 반환해야합니다. 나에게 난 후 벡터를주는 내가 filter을 사용하여 조작해야하는 가치와 first, 예컨대을 찾으려면 :

["/1417612450-second-migration.clj" {:applied false}] 

내 질문입니다; 다시 전체 상품에 대해 map을하지 않아도 특정 항목에 대한지도를 업데이트하려면 어떻게해야합니까? 어떻게 든 위의 내용을 참고 자료로 사용할 수 있습니까?

+0

': applied'가 필요합니까? ': date-applied'의 존재가 충분하지 않습니까? – Thumbnail

답변

3

일치하는 벡터가 다른 목적으로 반환 될 필요가 없다면 (즉, 업데이트를 위해 찾은 경우), 필터 대신 첫 번째 맵을 사용하고 각 항목을 업데이트가 필요한지 여부를 확인하고 적절하게 변경되거나 변경되지 않은 항목을 반환합니다.

(def test 
    [["/1417612109-first-migration.clj" {:applied true :date-applied 1423233980}] 
    ["/1417612450-second-migration.clj" {:applied false}] 
    ["/1417615919-forth-migration.clj" {:applied false}]]) 

(map #(if (:applied (second %)) 
     % ; if applied is already true then use it unchanged 
     (assoc-in % [1 :applied] true)) ; if applied is false update it 
    test) 

; (["/1417612109-first-migration.clj" {:applied true, :date-applied 1423233980}] 
; ["/1417612450-second-migration.clj" {:applied true}] 
; ["/1417615919-forth-migration.clj" {:applied true}]) 

바깥 쪽 컬렉션이 벡터가 아니어도 맵으로 만들 수 있습니다. "/1417612450-second-migration.clj"를 assoc-in 또는 update-in의 키로 사용하십시오.

(def test-map 
    {"/1417612109-first-migration.clj" {:applied true :date-applied 1423233980} 
    "/1417612450-second-migration.clj" {:applied false} 
    "/1417615919-forth-migration.clj" {:applied false}}) 

(def result ["/1417612450-second-migration.clj" {:applied false}]) 

(assoc-in test-map [(first result) :applied] true) 

;{"/1417612109-first-migration.clj" {:applied true, :date-applied 1423233980}, 
; "/1417612450-second-migration.clj" {:applied true}, 
;"/1417615919-forth-migration.clj" {:applied false}} 
0

업데이트 함수를 사용할 수있는 f는 이전 값을 취하고 새로운 하나를 반환하는 기능입니다 https://clojuredocs.org/clojure.core/update-in

(update-in my-vector [0 1 :applied] f) 

. 이 예제는 첫 번째 벡터에서 맵의 적용 값을 업데이트합니다. 또한 깊은 구조물에도 적용됩니다. 자세한 내용은 설명서를 참조하십시오.

+0

고마워요. 문제는 내가 찾은 항목의 색인이 무엇인지 알 수 없다는 것입니다. 필자는 더 큰 구조에서 필요한 구조를 얻기 위해'(first (filter ...))'를 효과적으로 사용했습니다. –

관련 문제