Clojure: извлечение карт с определенными значениями из Lazy Sequence

У меня есть ленивая последовательность Clojure:

{
    {:keyOne 123, :keyTwo "TestVal"}
    {:keyOne 456, :keyTwo "Value2"}
    {:keyOne 789, :keyTwo "TestVal"}
}

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

Я предполагаю, что смогу решить это с помощью filter, но я просмотрел все примеры, которые смог найти, и они никогда не используют такую ​​вложенную структуру.


person Jdv    schedule 30.10.2017    source источник


Ответы (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)

Неважно, является ли входная последовательность ленивой или неленивой (нетерпеливой).

person naoki fujita    schedule 30.10.2017
comment
map identity очень странно. Нет необходимости заставлять ввод быть ленивым: все, что работает для ленивых последовательностей, должно работать и для энергичных последовательностей, включая написанный вами код. - person amalloy; 30.10.2017
comment
Ваш комментарий точен. Бессмысленно рассматривать энергичную последовательность как ленивую последовательность. Я изменю свой ответ более практичным и точным. - person naoki fujita; 31.10.2017