Size: a a a

Clojure — русскоговорящее сообщество

2021 February 12

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Денис Нибаев
всем привет. какие есть варианты получше?
(reduce-kv (fn [acc k v]
              (assoc acc k
                     (reduce-kv (fn [acc k v]
                                  (assoc acc k (if (nil? v) ""  v))) {} v)))
            {}
            {:person
             {:firstName nil
              :lastName nil
              :middleName nil}
             :practitioner
             {:firstName "1", :lastName nil, :middleName nil, :id "pr2", :role ""}})
 ;; => {:person {:firstName "", :lastName "", :middleName ""}, :practitioner {:firstName "1", :lastName "", :middleName "", :id "pr2", :role ""}}
источник

IL

Igor Levdansky in Clojure — русскоговорящее сообщество
Денис Нибаев
всем привет. какие есть варианты получше?
(reduce-kv (fn [acc k v]
              (assoc acc k
                     (reduce-kv (fn [acc k v]
                                  (assoc acc k (if (nil? v) ""  v))) {} v)))
            {}
            {:person
             {:firstName nil
              :lastName nil
              :middleName nil}
             :practitioner
             {:firstName "1", :lastName nil, :middleName nil, :id "pr2", :role ""}})
 ;; => {:person {:firstName "", :lastName "", :middleName ""}, :practitioner {:firstName "1", :lastName "", :middleName "", :id "pr2", :role ""}}
(clojure.walk/postwalk #(or % "") ... )
источник

ДН

Денис Нибаев... in Clojure — русскоговорящее сообщество
решил попробовать через specter, как раз в проекте уже используется, есть повод его изучить.
спасибо
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Денис Нибаев
всем привет. какие есть варианты получше?
(reduce-kv (fn [acc k v]
              (assoc acc k
                     (reduce-kv (fn [acc k v]
                                  (assoc acc k (if (nil? v) ""  v))) {} v)))
            {}
            {:person
             {:firstName nil
              :lastName nil
              :middleName nil}
             :practitioner
             {:firstName "1", :lastName nil, :middleName nil, :id "pr2", :role ""}})
 ;; => {:person {:firstName "", :lastName "", :middleName ""}, :practitioner {:firstName "1", :lastName "", :middleName "", :id "pr2", :role ""}}
(->> {:person {:firstName nil :lastName nil :middleName nil}
       :practitioner {:firstName "1", :lastName nil, :middleName nil, :id "pr2", :role ""}}
      (clojure.walk/postwalk-replace {nil ""}))
=>
{:person {:firstName "", :lastName "", :middleName ""},
:practitioner {:firstName "1", :lastName "", :middleName "", :id "pr2", :role ""}}
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
(->> {:person {:firstName nil :lastName nil :middleName nil}
       :practitioner {:firstName "1", :lastName nil, :middleName nil, :id "pr2", :role ""}}
      (clojure.walk/postwalk-replace {nil ""}))
=>
{:person {:firstName "", :lastName "", :middleName ""},
:practitioner {:firstName "1", :lastName "", :middleName "", :id "pr2", :role ""}}
это если исходная задача звучит как «заменить в мапе все значения nil на ""»
источник

IL

Igor Levdansky in Clojure — русскоговорящее сообщество
Sergey Trofimov
(->> {:person {:firstName nil :lastName nil :middleName nil}
       :practitioner {:firstName "1", :lastName nil, :middleName nil, :id "pr2", :role ""}}
      (clojure.walk/postwalk-replace {nil ""}))
=>
{:person {:firstName "", :lastName "", :middleName ""},
:practitioner {:firstName "1", :lastName "", :middleName "", :id "pr2", :role ""}}
👍🏻
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
(->> {:person {:firstName nil :lastName nil :middleName nil}
       :practitioner {:firstName "1", :lastName nil, :middleName nil, :id "pr2", :role ""}}
      (clojure.walk/postwalk-replace {nil ""}))
=>
{:person {:firstName "", :lastName "", :middleName ""},
:practitioner {:firstName "1", :lastName "", :middleName "", :id "pr2", :role ""}}
но это ощутимо медленнее, чем оригинальный вариант
источник

IL

Igor Levdansky in Clojure — русскоговорящее сообщество
Если надо быстро и правильно, то да, лучше specter смотреть)
источник

IL

Igor Levdansky in Clojure — русскоговорящее сообщество
Что-нибудь такое (setval [MAP-VALS MAP-VALS nil?] ""  ...) нужная глубина и фильтр
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ну, лично я не считаю, что менять в мапе nil на пустые строки — «правильно» 😊
источник

IL

Igor Levdansky in Clojure — русскоговорящее сообщество
Ну, это от задачи уже зависит)
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Igor Levdansky
Ну, это от задачи уже зависит)
ну вот я не могу представить себе задачу, где такое преобразование было бы оправдано
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
если ты работаешь с {:firstName nil :lastName nil :middleName nil}, а тебе прилетает {:firstName nil :lastName nil}, то никакие замены тебя не спасут
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
если ты работаешь с одним полем из 10, то нафига другие 9 замен
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ну и в общем случае не всякий nil означает пустую строку, поэтому надо смотреть ещё и на имя ключа, чтобы решить, делать замену или нет
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
получается надёжней, понятней и эффективней такие замены делать при использовании поля, когда достаёшь из мапы и в том же контексте принимаешь решение о преобразовании вытащенных значений
источник

IL

Igor Levdansky in Clojure — русскоговорящее сообщество
Ну, может тут во вне куда-то эта мапка уходит, где контракт что поля не nullable
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Igor Levdansky
Ну, может тут во вне куда-то эта мапка уходит, где контракт что поля не nullable
плюс контракт, что поля не отсутствуют и т.д. 😊
берётся исходная мапа, соответствующая дефолтному контракту и в неё мержатся актуальные данные
источник

ДН

Денис Нибаев... in Clojure — русскоговорящее сообщество
Igor Levdansky
Что-нибудь такое (setval [MAP-VALS MAP-VALS nil?] ""  ...) нужная глубина и фильтр
это хорошо, а есть вариант обработать такое?
{:a {:firstName nil
                 :lastName nil
                 :middleName nil
                 :snils nil
                 :email nil
                 :id "pat2"}
             :b nil}
источник

IL

Igor Levdansky in Clojure — русскоговорящее сообщество
[MAP-VALS (multi-path [MAP-VALS] []) nil?]
источник