Size: a a a

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

2020 November 15

E

ETL in Clojure — русскоговорящее сообщество
Вопрос:
- есть вектор мапов с одинаковым набором ключей вида {:k 1 :q {:j 5}}
- мне нужно найти в нём те, у которого совпадает значение по вложенному ключу, применить к ним некую функцию и вернуть вектор обратно, таким образом, чтобы найденные по значению вложенного ключа мапы там отсутствовали, а присутствовали "незатронутые" применением функции мапы и мапа, полученная применением функции

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

Есть ли у кого гипотезы, как это возможно сделать?
источник

RN

Ryzhikov Nikolay in Clojure — русскоговорящее сообщество
я бы loop написал;)
источник

E

ETL in Clojure — русскоговорящее сообщество
Ryzhikov Nikolay
я бы loop написал;)
И вправду.
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ETL
Вопрос:
- есть вектор мапов с одинаковым набором ключей вида {:k 1 :q {:j 5}}
- мне нужно найти в нём те, у которого совпадает значение по вложенному ключу, применить к ним некую функцию и вернуть вектор обратно, таким образом, чтобы найденные по значению вложенного ключа мапы там отсутствовали, а присутствовали "незатронутые" применением функции мапы и мапа, полученная применением функции

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

Есть ли у кого гипотезы, как это возможно сделать?
  (let [f #(assoc % :was-here true)
       v [{:k 1 :q {:j 1}}
          {:k 1 :q {:j 2}}
          {:k 1 :q {:j 3}}]]
   (mapv (fn [m]
           (cond-> m
             (= 2 (-> m :q :j)) f))
         v))
=> [{:k 1, :q {:j 1}} {:k 1, :q {:j 2}, :was-here true} {:k 1, :q {:j 3}}]
источник

E

ETL in Clojure — русскоговорящее сообщество
Sergey Trofimov
  (let [f #(assoc % :was-here true)
       v [{:k 1 :q {:j 1}}
          {:k 1 :q {:j 2}}
          {:k 1 :q {:j 3}}]]
   (mapv (fn [m]
           (cond-> m
             (= 2 (-> m :q :j)) f))
         v))
=> [{:k 1, :q {:j 1}} {:k 1, :q {:j 2}, :was-here true} {:k 1, :q {:j 3}}]
П - поэзия, но есть момент. Предполагается, что мапов {:k 1, :q {:j 2}} - будет например 3, а [голосом ведущего с Первого канала] остаться должен ТОЛЬКО ОДИН )
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ETL
П - поэзия, но есть момент. Предполагается, что мапов {:k 1, :q {:j 2}} - будет например 3, а [голосом ведущего с Первого канала] остаться должен ТОЛЬКО ОДИН )
тогда что-то странное «тебе говорят»

что нужно вернуть, если ни один мап не попал под условие?
nil?
источник

E

ETL in Clojure — русскоговорящее сообщество
Sergey Trofimov
тогда что-то странное «тебе говорят»

что нужно вернуть, если ни один мап не попал под условие?
nil?
нет, мапов не подпадающих под условие в нём гарантированно нет, а вот два или три условно совпадающих - гарантированно есть
источник

E

ETL in Clojure — русскоговорящее сообщество
если быть совсем откровенным, то возникло разночтение за счет того, что коммент был написан не к той функции в битбакете и задача в правильном понимании мною уже решена ) но уже спортивный интерес возник )
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ETL
нет, мапов не подпадающих под условие в нём гарантированно нет, а вот два или три условно совпадающих - гарантированно есть
тогда так
  (let [f #(assoc % :was-here true)
       v [{:k 1 :q {:j 1}}
          {:k 1 :q {:j 2}}
          {:k 1 :q {:j 2}}]]
   (some (fn [m]
           (when (= 2 (-> m :q :j))
             (f m)))
         v))
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ETL
если быть совсем откровенным, то возникло разночтение за счет того, что коммент был написан не к той функции в битбакете и задача в правильном понимании мною уже решена ) но уже спортивный интерес возник )
ну, filter/remove не совсем правильный подход, когда тебе нужен только один элемент из коллекции
в таких случаях используется some.
источник

E

ETL in Clojure — русскоговорящее сообщество
Sergey Trofimov
ну, filter/remove не совсем правильный подход, когда тебе нужен только один элемент из коллекции
в таких случаях используется some.
За идею с some - челом бью, действительно крутая штука.

Но и вся остальная коллекция мне тоже нужна.
Из:
      [{:k 1 :q {:j 1}}
 
{:k 1 :q {:j 2}}
 
{:k 1 :q {:j 2}}]

мне необходимо получить:
     [{:k 1 :q {:j 1}}
 
{:k 1 :q {:j 2}} :was-here true]
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ETL
За идею с some - челом бью, действительно крутая штука.

Но и вся остальная коллекция мне тоже нужна.
Из:
      [{:k 1 :q {:j 1}}
 
{:k 1 :q {:j 2}}
 
{:k 1 :q {:j 2}}]

мне необходимо получить:
     [{:k 1 :q {:j 1}}
 
{:k 1 :q {:j 2}} :was-here true]
то есть повторяющиеся по другим условиям элементы остаются, а попадающие под условие только в одном варианте?
ну у вас и задачи 😊
источник

E

ETL in Clojure — русскоговорящее сообщество
повторяющихся по другим условиям элементов там тоже нет ) да строго говоря - нет такой задачи, задача которая реально была - была проще ) но в любом случае, полезный опыт вынесен, Сергей-сенсей )
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ETL
За идею с some - челом бью, действительно крутая штука.

Но и вся остальная коллекция мне тоже нужна.
Из:
      [{:k 1 :q {:j 1}}
 
{:k 1 :q {:j 2}}
 
{:k 1 :q {:j 2}}]

мне необходимо получить:
     [{:k 1 :q {:j 1}}
 
{:k 1 :q {:j 2}} :was-here true]
  (let [f #(assoc % :was-here true)
       v [{:k 1 :q {:j 1}}
          {:k 1 :q {:j 2}}
          {:k 1 :q {:j 3}}
          {:k 1 :q {:j 2}}]
       changed? (volatile! false)]
   (into []
         (keep (fn [m]
                 (if (= 2 (-> m :q :j))
                   (when (not @changed?)
                     (do
                       (vreset! changed? true)
                       (f m)))
                   m)))
         v)
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
  (let [f #(assoc % :was-here true)
       v [{:k 1 :q {:j 1}}
          {:k 1 :q {:j 2}}
          {:k 1 :q {:j 3}}
          {:k 1 :q {:j 2}}]
       changed? (volatile! false)]
   (into []
         (keep (fn [m]
                 (if (= 2 (-> m :q :j))
                   (when (not @changed?)
                     (do
                       (vreset! changed? true)
                       (f m)))
                   m)))
         v)
=> [{:k 1, :q {:j 1}} {:k 1, :q {:j 2}, :was-here true} {:k 1, :q {:j 3}}]
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
  (let [f #(assoc % :was-here true)
       v [{:k 1 :q {:j 1}}
          {:k 1 :q {:j 2}}
          {:k 1 :q {:j 3}}
          {:k 1 :q {:j 2}}]
       changed? (volatile! false)]
   (into []
         (keep (fn [m]
                 (if (= 2 (-> m :q :j))
                   (when (not @changed?)
                     (do
                       (vreset! changed? true)
                       (f m)))
                   m)))
         v)
надеюсь теперь-то то, что нужно 😊
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
надеюсь теперь-то то, что нужно 😊
и надеюсь, что это тянет на гипотезу
источник

ST

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

E

ETL in Clojure — русскоговорящее сообщество
Sergey Trofimov
надеюсь теперь-то то, что нужно 😊
😳😳😳 судя по результату - да,
осталось разобраться, как работает volatile? / keep / vreset! ☺️
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ETL
😳😳😳 судя по результату - да,
осталось разобраться, как работает volatile? / keep / vreset! ☺️
хорошо тебе, как много ты не знаешь 😊
источник