(without actual context) Here's what I'd probably do. There's a bit of 
repetition, but it's clear what's going on, so I don't mind.

assuming the my-map def from the original email.

user=> (defn select-nested-keys [m top-level-keys & {:as pairs}]                
                      
  (reduce #(update-in %1 (first %2) select-keys (last %2)) (select-keys m 
top-level-keys) pairs))
#'user/select-nested-keys
user=> (select-nested-keys my-map [:spouse :name :email :address]               
                      
   [:address] [:state :city]                                                    
               
   [:spouse] [:name :address]                                                   
               
   [:spouse :address] [:state :city])
{:address {:city "San Francisco", :state "CA"}, :email "j...@doe.com", :name 
"John Doe", :spouse {:address {:city "Atlanta", :state "GA"}, :name "Jane Doe"}}

The first vector is the top level keys, the following vectors are pairs of the 
path to the k/v pair and which vals should be selected.

Cheers, Jay

On May 28, 2012, at 6:18 PM, Laurent PETIT wrote:

> Le 29 mai 2012 à 00:14, Jay Fields <j...@jayfields.com> a écrit :
> 
>> use destructuring?
> 
> I dont know, destructuring would, well, destructure the input map, giving you 
> all the bits on the table, but unable to restructure it with the original 
> shape. 
> 
> As I understand it, BG would like some kind of shape-preserving 
> filter/dissoc. 
>> 
>> On May 28, 2012, at 6:12 PM, Laurent PETIT wrote:
>> 
>>> Le 29 mai 2012 à 00:03, Laurent PETIT <laurent.pe...@gmail.com> a écrit :
>>> 
>>>> Hello bg,
>>>> For describing the subsets you want, why not use as a bottom 
>>>> representation something more connected with clojure datastructures?
>>>> 
>>>> Like 
>>>> set literal => set of sibling keys
>>>> Vector => path to an inner key
>>>> Map => I see no usage for maps right now 
>>>> 
>>>> Your example could then become:
>>>> 
>>>> #{[:name]
>>>>      [:email]
>>>>      [:adress #{:city :state}]
>>>>      [:spouse #{:name [:address #{:city :state}]}
>>> 
>>> I don't have an implementation to offer, but as I see it, it could be some 
>>> kind of superset of get-in, extending its syntax, if you will. 
>>>> 
>>>> What about that ?
>>>> 
>>>> 
>>>> 
>>>> Le 26 mai 2012 à 06:59, Baishampayan Ghose <b.gh...@gmail.com> a écrit :
>>>> 
>>>>> Hi,
>>>>> 
>>>>> I have a problem wherein I need to select subsets of a given map;
>>>>> think about select-keys, but with arbitrary nesting.
>>>>> 
>>>>> For example, consider this map -
>>>>> 
>>>>> (def my-map {:name "John Doe"
>>>>>               :email "j...@doe.com"
>>>>>               :address {:house "42"
>>>>>                         :street "Moon St."
>>>>>                         :city "San Francisco"
>>>>>                         :state "CA"
>>>>>                         :zip 76509
>>>>>                         :mobile "+188888888"}
>>>>>               :ssn "123456"
>>>>>               :spouse {:name "Jane Doe"
>>>>>                        :ssn "654321"
>>>>>                        :relation :wife
>>>>>                        :address {:house "42"
>>>>>                                  :street "Moon St."
>>>>>                                  :city "Atlanta"
>>>>>                                  :state "GA"
>>>>>                                  :zip 76509
>>>>>                                  :mobile "+188888888"}}})
>>>>> 
>>>>> From the above map, I want to extract this sub-map -
>>>>> 
>>>>> {:spouse {:name "Jane Doe", :address {:state "GA", :city "Atlanta"}},
>>>>> :name "John Doe",
>>>>> :email "j...@doe.com",
>>>>> :address {:state "CA", :city "San Francisco"}}
>>>>> 
>>>>> What would be a good way to express this sub-map so that I can pass it
>>>>> on to a function?
>>>>> 
>>>>> I am thinking about something like this -
>>>>> 
>>>>> [:name :email {:address [:city :state]} {:spouse [:name {:address
>>>>> [:city :state]}]}]
>>>>> 
>>>>> Example implementations are also welcome.
>>>>> 
>>>>> Regards,
>>>>> BG
>>>>> 
>>>>> -- 
>>>>> Baishampayan Ghose
>>>>> b.ghose at gmail.com
>>>>> 
>>>>> -- 
>>>>> 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 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 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

Reply via email to