Whoops… that's missing an all important (merge (into {} top)).

On Thursday, 16 January 2014 14:36:45 UTC, James wrote:
>
> Thanks for the pointers. I've gotten as far as grouping the keys by the 
> prefix using `group-by`, and added clunky support for keys that aren't 
> nested like so:
>
> ``` clj
> (defn- nested-key [k]
>   (some-> (re-matches #"^(.*)--(.*)$" (name k))
>           second
>           keyword))
>
> (defn nest-relations
>   "Walks the given hash-map, and moves any keys of the form
>   <group>--<key> into a nested hash-map."
>   [m]
>   (let [grouped (group-by (fn [[k _]] (or (nested-key k) ::top)) m)
>         top (::top grouped)]
>     (-> grouped
>         (dissoc ::top)
>         (merge top))))
> ```
>
> I end up with vectors instead of hash-maps, and I'm particularly happy 
> with the code, but it's getting there.
>
> On Thursday, 16 January 2014 13:58:45 UTC, Jim foo.bar wrote:
>>
>> You could do something like this: 
>>
>>
>> (def v {:a--id 1 :a--name "A" :b--id 2 :b--name "B"}) 
>>
>> (group-by #(-> % first str second str keyword) v) 
>>
>> =>{:b [[:b--name "B"] [:b--id 2]], :a [[:a--id 1] [:a--name "A"]]} 
>>
>> (reduce-kv #(assoc % %2 (into {} %3)) {} *1) 
>>
>> => {:a {:a--id 1, :a--name "A"}, :b {:b--name "B", :b--id 2}} 
>>
>> all that's left is the names in the inner map... 
>>
>> HTH, 
>>
>> Jim 
>>
>>
>> On 16/01/14 13:46, James Conroy-Finn wrote: 
>> > Hello all, 
>> > 
>> > I've found myself stuck trying to move matching keys in a hash into a 
>> > nested hash. 
>> > 
>> > For example,: 
>> > 
>> > {:a--id 1 :a--name "A" :b--id 2 :b--name "B"} ;=> {:a {:id 1 :name 
>> > "A"} :b {:id 2 :name "B"}} 
>> > 
>> > I've tried `clojure.walk`, I've tried building the args to `assoc-in`, 
>> > and using `apply`. I honestly feel like I'm missing something really 
>> > obvious, like something with group-by. 
>> > 
>> > Any tips would be greatly appreciated. I'll keep hammering away. 
>> > -- 
>> > -- 
>> > You received this message because you are subscribed to the Google 
>> > Groups "Clojure" group. 
>> > To post to this group, send email to clo...@googlegroups.com 
>> > Note that posts from new members are moderated - please be patient 
>> > with your first post. 
>> > To unsubscribe from this group, send email to 
>> > clojure+u...@googlegroups.com 
>> > For more options, visit this group at 
>> > http://groups.google.com/group/clojure?hl=en 
>> > --- 
>> > You received this message because you are subscribed to the Google 
>> > Groups "Clojure" group. 
>> > To unsubscribe from this group and stop receiving emails from it, send 
>> > an email to clojure+u...@googlegroups.com. 
>> > For more options, visit https://groups.google.com/groups/opt_out.  
>>
>

-- 
-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to