2016-08-31 2 views
0

지도에서 값으로 Clojure 벡터를 채우려고합니다. 지도에 필요한 값을 저장하는 특정 키의 벡터가 있습니다. key-vec를 반복하고지도에서 값을 가져 와서 다른 벡터에 저장해야합니다.Clojure 벡터 채우기

내가 루프 + RECUR 사용하여 시도했다 :

(let [keys-vec (:keys-vec item) 
     my-map (:my-map item)] 

    (loop [newV [] 
      i 0] 
     (if (< i (count keys-vec)) 
     (recur 
      (conj newV (get my-map (get keys-vec i))) 
      (inc i)) 

     newV))) 

을 그리고 그것은했다. 하지만 Clojure는 최소한의/효과적인 코드 작성 스타일로 잘 알려져 있으며 더 좋은 방법이 있는지 알고 싶었습니다.

아이디어가 있으십니까?

+1

달성하고자하는 목표는 무엇입니까? '(def new-vector existing-vector) '가 문제를 해결하지 않습니까? – superkonduktr

+2

나는 Clojure의 컬렉션이 불변하고 영구하기 때문에 'loop'와 요소의 인덱스를 사용하여 벡터를 반복하는 것은 Clojure의 안티 패턴에 가깝다고 생각한다. 대신, 감소 함수를 사용하는 것이 좋습니다. 작업을 수행하는 관용적 방법은 간단히'(vals (select-keys my-map keys-vec))'입니다. – superkonduktr

+0

당신 말이 맞습니다. 감사! –

답변

2

select-keys 함수가 맵에서 원하는 키만 추출되기를 원합니다. http://clojuredocs.org/clojure.core/select-keys

다음은 필터링 된지도에서 모든 값을 추출하기 위해 vals 기능을 사용 : 참조

> (def my-map {:a 1 :b 2 :c 3}) 
> (def my-keys [:a :b]) 
> (select-keys my-map my-keys) 
{:a 1, :b 2} 

> (def filtered-map (select-keys my-map my-keys)) 
> filtered-map 
{:a 1, :b 2} 

> (vals filtered-map) 
(1 2) 

당신은 항상 Clojure의 쪽지 오픈 브라우저 탭을 유지해야합니다. 원하는 기능을 찾는 데 매우 중요합니다. 반복해서 공부하면 몇 년 동안 새로운 것을 발견하게 될 것입니다.

http://jafingerhut.github.io/cheatsheet/clojuredocs/cheatsheet-tiptip-cdocs-summary.html

+0

그것은 일했다! 감사 –

3

가장 관용적 인 방법은 원본 벡터를 사용하는 것입니다. 나는 불변의 데이터 구조를 명시 적으로 복제 할 이유가 없다.

1

Alan Thompson's example 사용 :

(def my-map {:a 1 :b 2 :c 3}) 
(def my-keys [:a :b]) 

... 간단하고 빠른 해결책이

(mapv my-map my-keys) 
;[1 2] 

대안

(vals (select-keys my-map my-keys)) 
;(2 1) 
입니다 이것은 내가 가장 좋아하는 버전입니다 0

... my-keys에 의해 주어진 순서를 유지할 수 없습니다 (이 경우에는 그렇지 않습니다).