Создание коллекции нескольких значений одинаковой глубины во вложенной хэш-карте

Вот гипотетический хэш-файл с именем args:

{:body {:milestones [{:status 1 :otherValues x} 
                     {:status 2 :otherValues z} 
                     {:status 1 :otherValues y]}}

Моя цель - иметь коллекцию значений для каждого: статусный ключ. Они все на одной глубине, являясь дитями: вех.

Я подхожу ближе. Я знаю, как получить значение первого статуса, выполнив это:

(let [{[{:keys [status]} x] :milestones} :body} args]
  (println status))

Очень дальняя цель - выяснить, какие карты содержат: статус со значением 1, и создать новую коллекцию с каждой отдельной картой.

Буквальное применение этого - подключение к TeamworkPM и синхронизация этапов со статусом "поздний" или "неполный" с Google Calenders.

В этом сценарии желаемым результатом будет {1, 2, 1}. Конечная цель - иметь

 {{:status 1 :otherValues x} 
  {:status 1 :otherValues Y}}

1 ответ

Решение

Хотя я и не смог выяснить, как непосредственно деструктурировать вектор карты в переменную, вместо этого вы можете сначала получить дочерний элемент :milestones, а затем использовать основные map или же filter,

Обратите внимание, что вы можете получить значение карты, применив его как функцию. (например, если m является {:key1 "val1"}, (m :key1) было бы "val1")

(def args {:body {:milestones [{:status 1 :otherValues 'x}
                               {:status 2 :otherValues 'z}
                               {:status 1 :otherValues 'y}]}})

(let [{{x :milestones} :body} args,
        y (map #(% :status) x),
        z (filter #(= (% :status) 1) x)
      ]
      (println x) ; [{:status 1, :otherValues x} {:status 2, :otherValues z} {:status 1, :otherValues y}]
      (println y) ; (1 2 1)
      (println z) ; ({:status 1, :otherValues x} {:status 1, :otherValues y})
  )
Другие вопросы по тегам