2017-09-04 5 views
1

지도 내에서 벡터 내에지도가 있습니다.지도 내에서 벡터 내의 중첩 된지도 업데이트

{ :label "Apparel & Accessories", 
    :img_class "itm_3", 
    :children [ 
      {:id "sub1", 
       :label "Clothing", 
       :markup [:div] 
      } 
      {:id "sub2", 
       :label "Shoes & Footwear", 
       :markup [:div] 
      } 
    ] 
} ` 

내가 원하는 것은 모든 항목의 마크 업을 해독하는 것입니다. 나는 이것을 2 시간 동안 애써왔다. 내가 가진 유일한 열쇠는 해독 열쇠입니다. 그러나 마크 업 키만 제거하면됩니다.

그래서 최종 출력은 모든 기여는 매우 감사

{ :label "Apparel & Accessories", 
    :img_class "itm_3", 
    :children [ 
      {:id "sub1", 
       :label "Clothing", 
      } 
      {:id "sub2", 
       :label "Shoes & Footwear", 
      } 
    ] 
} ` 

해야한다. 초기지도 m 경우

+1

https://github.com/nathanmarz/specter#specter- – bfontaine

답변

0

이 가능한 솔루션은 :children의 값의 :markup 키를 제거하고 초기지도에 결과를 대체한다이

(assoc m :children (mapv #(dissoc % :markup) (m :children))) 

입니다.

+0

"ClassCastException clojure.lang.LazySeq can not cast to clojure.lang.IFn"오류가 발생합니다. – shan

2

'한 번에 모든'는 변화를 만들 수있는 좋은 습관입니다 : 여기

(update m :children (fn [v] (assert (vector? v)) (mapv #(dissoc % :markup) v))) 

m 한 번만 언급되고있다. 예를 들어 swap!을 수행하는 경우 문제가 될 수 있습니다.

당신이 벡터를 가지고, 아직 다음이 작동 즉시 일을 만들지 않으려면 :

(update m :children (fn [xs] 
         (->> xs 
          vec 
          (mapv #(dissoc % :markup))))) 

을하지만, 다른 한편으로 벡터를 사용하는 것으로 실제 필요가 없습니다. 나는 하나도 불행하게도 두 단계에서 그것을 해결

'({:id "sub1", 
    :label "Clothing", 
    :markup [:div]} 
{:id  "sub2", 
    :label "Shoes & Footwear", 
    :markup [:div]}) 
+0

내지도가 Lazy라고 생각합니다. 귀하의 솔루션을 사용하면 "ClassCastException clojure.lang.LazySeq를 clojure.lang.Associative로 캐스팅 할 수 없습니다"오류가 발생합니다. – shan

+0

AssertionError 어설 션 실패 : (벡터? v) – shan

+0

데이터가 질문과 다릅니다. 'into [] '를 사용하여 데이터를 변경할 수 있습니다. 그러나 나는 단언을 꺼내서 그것이 지역적으로 작동하도록 할 것입니다 ... –

1

: :children로 설정 될 때 assert하지 않고 원래의 솔루션은 잘 작동합니다.

(def m { :label "Apparel & Accessories", :img_class "itm_3", :children [ {:id "sub1", :label "Clothing", :markup [:div] } {:id "sub2", :label "Shoes & Footwear", :markup [:div] } ] }) 

(defn dissoc-markup [child] 
    (dissoc child :markup)) 

(update m :children #(mapv dissoc-markup %)) 
1

제거하려는 것이 확실한 경우 마크 업 당신이 그것을 볼 때마다, 여기에 그것을 할 수있는 간단한 방법은 다음과 같습니다

(def your-data {:your-data "...."}) 
(clojure.walk/postwalk (fn [m] 
         (if (map? m) 
          (dissoc m :markup) 
          m)) 
         your-data) 
당신은 당신이 원하는 않는 유령을 고려하는 것이 좋습니다