2016-08-12 145 views
0

比方說,我有我怎麼想的哈希轉出的映射,像這樣新的鍵名一起:紅寶石變換散列

JSON_MAP = { 
    image: { 
    id: :id, 
    media_url: :url, 
    time: :duration, 
    timestamp: :time_posted, 
    text_caption: :caption, 
    metadata: { 
     camera: :camera_type, 
     flash: :camera_flash 
    } 
    }, 
    viewers: { 
    views: :view_count, 
    likes: :likes_count 
    } 
} 

,我有這樣一個哈希:

{ 
    image: { 
    id: 1, 
    media_url: 'http://placekitten.com', 
    nsfw: false, 
    time: 4, 
    timestamp: 14149292, 
    text_caption: "I'm a kitten", 
    metadata: { 
     camera: 'iPhone', 
     flash: true 
    } 
    }, 
    viewers: { 
    views: 50, 
    likes: 15 
    }, 
    extras: { 
    features: { 
     enabled: true 
    } 
    } 
} 

我只想所以它結束了像它轉換成數據:

{ 
    image: { 
    id: 1, 
    url: 'http://placekitten.com', 
    duration: 4, 
    time_posted: 14149292, 
    caption: "I'm a kitten", 
    metadata: { 
     camera: 'iPhone', 
     flash: true 
    } 
    }, 
    viewers: { 
    view_count: 50, 
    likes_count: 15 
    } 
} 

基本上,重命名基於源地圖上的所有按鍵,並刪除任何不匹配源映射的鍵...

+0

你需要證明你的努力來解決這個問題。僅僅向我們展示所需的數據表明您希望我們爲您編寫代碼,這不是它的目的。請閱讀「[問]」,包括鏈接的頁面。另外「[Stack Overflow用戶需要多少研究工作?](http://meta.stackoverflow.com/q/261592/128421)」很有用。 –

回答

1

您可以使用遞歸獲得您想要的結果。

def convert(mapper, hsh) 
    mapper.each_with_object({}) do |(k,o),h| 
    next unless hsh.key?(k) 
    if o.is_a? Hash 
     h[k] = convert(o, hsh[k]) 
    else 
     h[o] = hsh[k] 
    end 
    end 
end 

假設h等於你的第二個散列,

convert(JSON_MAP, h)  
    #=> { :image=>{ 
    #  :id=>1, 
    #  :url=>"http://placekitten.com", 
    #  :duration=>4, 
    #  :time_posted=>14149292, 
    #  :caption=>"I'm a kitten", 
    #  :metadata=>{ 
    #   :camera_type=>"iPhone", 
    #   :camera_flash=>true 
    #  } 
    #  }, 
    #  :viewers=>{ 
    #  :view_count=>50, 
    #  :likes_count=>15 
    #  } 
    # } 
+0

Hrm,這不適合我 - 說「遞歸」不是一種方法? –

+0

我最初有兩種方法:'convert'和'recurse',然後意識到我只需要一個'convert',但是我忘記將'recurse'更改爲'convert'。我做了更正。 –

+0

謝謝 - 雖然當hsh [k]在該行沒有問題時獲得問題.. –