红宝石变换散列
比方说,我有我怎么想的哈希转出的映射,像这样新的键名一起:红宝石变换散列
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
}
}
基本上,重命名基于源地图上的所有按键,并删除任何不匹配源映射的键...
您可以使用递归获得您想要的结果。
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
# }
# }
Hrm,这不适合我 - 说“递归”不是一种方法? –
我最初有两种方法:'convert'和'recurse',然后意识到我只需要一个'convert',但是我忘记将'recurse'更改为'convert'。我做了更正。 –
谢谢 - 虽然当hsh [k]在该行没有问题时获得问题.. –
你需要证明你的努力来解决这个问题。仅仅向我们展示所需的数据表明您希望我们为您编写代码,这不是它的目的。请阅读“[问]”,包括链接的页面。另外“[Stack Overflow用户需要多少研究工作?](http://meta.stackoverflow.com/q/261592/128421)”很有用。 –