Sto cercando una funzione simile a quelli in clojure.walk che hanno una funzione inner
che prende come argomento:Clojure - camminare con percorso
- non una chiave e un valore, come è il caso con il clojure. walk/walk function
- ma il vettore di chiavi necessarie per accedere a un valore dalla struttura di dati di livello superiore.
- attraversa ricorsivamente tutti i dati
Esempio:
;; not good since it takes `[k v]` as argument instead of `[path v]`, and is not recursive.
user=> (clojure.walk/walk (fn [[k v]] [k (* 10 v)]) identity {:a 1 :b {:c 2}})
;; {:a 10, :c 30, :b 20}
;; it should receive as arguments instead :
[[:a] 1]
[[:b :c] 2]
Nota:
- dovrebbe funzionare con array anche utilizzando i tasti 0, 1, 2 ... (proprio come in
get-in
). - Non mi interessa davvero il parametro
outer
, se questo consente di semplificare il codice.
Nel tuo esempio, non dovrebbe essere il dato '{[: un: k1] 1, [: un: k2] 2, [: B 0] 1, [ : b 1] 2, [: b 2] 3} '? – nha
Oops, davvero! C'è un errore nel per-index-seguenti del regolamento provvisorio, dovrebbe essere: (vector map (range) Coll) invece di: (vector map Coll (range)) io aggiornare la mia risposta :) – kimsnj
Grazie ! Ho accettato la tua risposta, ma vorrei comunque avere una soluzione che non richieda percorsi di enumerazione (il mio caso d'uso è una migrazione del database che richiede alcune trasformazioni). – nha