2016-08-12 3 views
0

のは、私はこのような新しいキーの名前と一緒に、私はハッシュが判明する方法のマッピングを持っているとしましょう:はRubyのマッピングに基づいてハッシュを変換

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

あなたが問題を解決するために、あなたの試みを表示する必要があります。目的のデータを表示しているだけでは、SOが何であるかを示すコードではなく、リンクされたページを含む「[ask]」をお読みください。また、「どのくらいの研究努力がStack Overflowユーザーに期待されていますか?」(http://meta.stackoverflow.com/q/261592/128421) "が役に立ちます。 –

答えて

1

再帰を使用して目的の結果を得ることができます。 hと仮定すると、あなたの第2のハッシュに等しい

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 

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'という2つのメソッドを持っていました。私はただ一つの 'convert'しか必要ではないことを認識しましたが、' recurse'を 'convert'に変更するのを忘れました。私は訂正をしました。 –

+0

ありがとうございます。しかし、その行のhsh [k]がnilのときに問題が発生します。 –

関連する問題