Создание коллекции нескольких значений одинаковой глубины во вложенной хэш-карте
Вот гипотетический хэш-файл с именем 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})
)