2016-08-31 6 views
0

Я пытаюсь заполнить вектор Clojure со значениями с карты. У меня есть еще один вектор конкретных ключей на карте, где хранятся значения, которые мне нужны. Мне нужно перебрать ключ-vec, получить значения с карты и сохранить их в другом векторе.Заполнить вектор Clojure

Я попытался с помощью петли + повторялись:

(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' и elements, поскольку коллекции 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 Cheatsheet во все времена. Это бесценно для поиска функций, которые вы хотите. Продолжайте изучать его неоднократно, так как вы будете продолжать находить новые вещи годами. Это моя любимая версия:

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) 

... не может (и в этом случае нет) поддерживать порядок, заданный my-keys.

 Смежные вопросы

  • Нет связанных вопросов^_^