Clojure: пройти через json и вернуть true или false, в зависимости от результата проверки условности для каждой пары ключ: значение в данном документе

Я пытался вернуть true или false в зависимости от значения, присутствующего в данной хэш-карте. Я пытался использовать уменьшенный kv, но это действительно не работает.

например: {:address {:zip 411045, :city "pune"}, :coupans ["abc" "def"], :cost 200, :items [{:category "partywear", :name "shirt", :price 50.26} {:category "partywear", :name "trouser", :price 10.26}]}

Я хочу написать функцию, которая, если "items.price" = 50.26 and "items.name" = "shirt", должна возвращать true, а "items.price = 10.26 and "items.name" = "shirt" должна возвращать false.

Сначала я выравниваю массив, а затем меняю ключ на ключ регулярного выражения (def compare_str_regex (clojure.string/replace compare_str #"\[\]" "\\\\[\\[0-9\\]+\\\\]")), например: items[].price -- > items[[0-9]+].price Затем я использую reduce-kv для итерации, но проблема в том, он проверит весь документ, который должен использовать условие и между двумя отправленными ключами

(reduce-kv (fn [m k v]
             (if (and (re-find (re-pattern compare_str_regex ) k)
                      (op value v))
               (reduced true)
               false))  {} flat_pl_map)

person Ravi Bhanushali    schedule 22.10.2018    source источник
comment
Пожалуйста, отредактируйте свой вопрос и включите то, что вы пробовали. Спасибо.   -  person Bob Jarvis - Reinstate Monica    schedule 23.10.2018
comment
@BobJarvis Спасибо!   -  person Ravi Bhanushali    schedule 23.10.2018
comment
Вы можете немного почитать, чтобы понять, как подходить к таким проблемам: braveclojure.com/clojure-for-the-brave-and-true   -  person Alan Thompson    schedule 23.10.2018
comment
@AlanThompson спасибо Алану, но я тоже над этим поработал. Я работаю над этим несколько дней, но не могу найти точное решение, поэтому разместил здесь!   -  person Ravi Bhanushali    schedule 23.10.2018
comment
Вы должны взглянуть на стандартную функцию get-in, которая даст вам хотя бы часть пути к тому, что вы хотите. Например, если ваша структура JSON выше определена как json-data, вы можете найти цену первого товара, используя (get-in json-data [:items 0 :price]). Вам нужно будет улучшить его, чтобы пройти через любые встроенные коллекции, такие как :items, а затем придумать способ обработки результатов и обработки условия and.   -  person Bob Jarvis - Reinstate Monica    schedule 24.10.2018


Ответы (1)


Если правило «возвратить true, если в коллекции items есть какие-либо записи с :name "shirt" и :price 50.26», то я бы написал эту функцию следующим образом:

Если это правильно, то я бы написал эту функцию так:

(fn [{:keys [items]}]
  (some (fn [{:keys [name price]}]
          (and (= "shirt" name) (= 50.26 price)))
        items))
person gfredericks    schedule 23.10.2018
comment
эй спасибо за ответ. На самом деле, в чем заключается проблема: может быть несколько ключей, таких как items.name shirt, items.price 10.00. Я хочу проверить, удовлетворяются ли обе пары значений ключа в одной и той же полезной нагрузке внутри массива элементов. - person Ravi Bhanushali; 23.10.2018