Clojure: извлечение карт с конкретными значениями из Lazy Sequence
У меня есть Clojure Lazy Sequence:
{
{:keyOne 123, :keyTwo "TestVal"}
{:keyOne 456, :keyTwo "Value2"}
{:keyOne 789, :keyTwo "TestVal"}
}
Я хочу получить карты, которые имеют определенное значение для данного ключа, например, я хочу, чтобы все карты имели значение "TestVal"
как :keyTwo
значение, поэтому я ожидаю, что первый и третий элемент в моем результате.
Я предполагаю, что смогу решить эту проблему, используя filter
, но я просмотрел все примеры, которые смог найти, и они никогда не использовали такую вложенную структуру.
1 ответ
Решение
{{:keyOne 123, :keyTwo "TestVal"}
{:keyOne 456, :keyTwo "Value2"}
{:keyOne 789, :keyTwo "TestVal"}}
В clojure это выражение не имеет смысла, это не ленивая последовательность карт. Чтобы ответить на ваш вопрос адекватно, я думаю, что входные данные, как показано ниже:
(def input '({:keyOne 123, :keyTwo "TestVal"}
{:keyOne 456, :keyTwo "Value2"}
{:keyOne 789, :keyTwo "TestVal"}))
Мы можем сделать выражение для вашей цели следующим образом:
(filter (fn [m] (= "TestVal" (:keyTwo m))) input)
Неважно, будет ли входная последовательность ленивой или не ленивой (нетерпеливой).