2013-07-27 5 views
9

{:foo {:bar 1 :baz [2 3] :qux {:quux 4}} :corge 5} जैसे कीवर्ड कीवर्ड के साथ घोंसला वाले मानचित्र को देखते हुए, मैं flatten-map को कैसे कार्यान्वित कर सकता हूं ताकि (flatten-map {:foo {:bar 1 :baz [2 3] :qux {:quux 4}} :corge 5} "-"){:foo-bar 1 :foo-baz [2 3] :foo-qux-quux 4 :corge 5} जैसे कुछ उत्पन्न कर सके।कुंजी में शामिल होने से मानचित्र को फ़्लैटन करना

मेरे सबसे अच्छा प्रयास है:

(defn flatten-map 
    ([form separator] (flatten-map form separator nil)) 
    ([form separator prefix] 
    (if (map? form) 
    (into {} (map (fn [[k v]] 
        [(keyword (str prefix (name k))) 
        (flatten-map v separator (str prefix (name k) separator))]) 
        form)) 
    form))) 

आप देख सकते हैं मैं flatten-map केवल "पत्ते" का चयन करने के लिए नहीं मिल सकता है।

उत्तर

11
(defn flatten-map 
    ([form separator] 
    (into {} (flatten-map form separator nil))) 
    ([form separator pre] 
    (mapcat (fn [[k v]] 
       (let [prefix (if pre (str pre separator (name k)) (name k))] 
       (if (map? v) 
        (flatten-map v separator prefix) 
        [[(keyword prefix) v]]))) 
       form))) 

आप बिना शर्त नया कुंजी/मान जोड़े निर्माण कर रहे थे, तब भी जब मूल्य का विस्तार किया जा रहा था, तो मैं शीर्ष स्तर में इतनी mapcat करने के लिए कि एक परिणाम हो सकता है "सम्मिलित" किया है (यह भी आवश्यक बंटवारे नक्शा बदल दिया (into {} ...) फ़ॉर्म के शीर्ष स्तर संस्करण में, क्योंकि हम वास्तव में कहीं भी किसी भी मानचित्र को नहीं चाहते हैं लेकिन आउटपुट का शीर्ष स्तर)।

यह इस प्रकार से अपने उदाहरण के साथ काम करता है:

user> (flatten-map {:foo {:bar 1 :baz [2 3] :qux {:quux 4}} :corge 5} "-") 
{:foo-bar 1, :foo-qux-quux 4, :foo-baz [2 3], :corge 5} 
+0

बिल्कुल सही! धन्यवाद। –

संबंधित मुद्दे