我有点红宝石,并且似乎无法掌握,似乎是嵌套在数组中的哈希?!
如果我运行以下内容:
widgets = Sinatra::Application.settings.history
widgets.each do |key, value|
puts key
puts value
end
我得到以下结果:
sales31
data: {"text":"Moeslein Nate","dataImg":"/vinD.jpg","id":"sales31","updatedAt":1511232577}
然而;当我尝试使用密钥仅提取值时,我遇到了错误:
widgets = Sinatra::Application.settings.history
widgets.each do |key|
puts key[:data]
end
遇到错误
TypeError - no implicit conversion of Symbol into Integer
这让我相信它是一个带有嵌套哈希的数组,所以我尝试了:
widgets = Sinatra::Application.settings.history
widgets.each do |key|
puts key[0]
end
再次打印密钥
sales30
sales31
如果我尝试提取嵌套数据:
widgets = Sinatra::Application.settings.history
widgets.each do |key|
puts key[0][:data]
end
返回Type Error
这次只是钥匙的第一个字母:
widgets = Sinatra::Application.settings.history
widgets.each do |key|
puts key[0][0]
end
有人可以详细说明解析这些数据的最佳/最可行方式,因此我可以使用KEY来提取特定值:
widgets[sales31][text]
关于打印实际文本的位置:
Moeslein Nate
感谢您的时间!
答案 0 :(得分:1)
我认为你错过了在“数据”中有另一层哈希的事实
所以访问它的正确方法是:
widgets["sales31"]["data"]["text"]
因此,
widgets = Sinatra::Application.settings.history
widgets.each do |key, val|
puts val["text"]
end
因为val
的值是:
"data": {"text":"Moeslein Nate","dataImg":"/vinD.jpg","id":"sales31","updatedAt":1511232577}
这是哈希本身。 所以小部件是哈希:
widgets == {"sales31": "data": {"text": "Moeslein Nate", "dataImg": "/vinD.jpg", "id": "sales31", "updatedAt" :1511232577} }
widgets["sales31"] == { "data": {"text": "Moeslein Nate", "dataImg": "/vinD.jpg", "id": "sales31", "updatedAt" :1511232577} }
widgets["sales31"]["data"] == {"text": "Moeslein Nate", "dataImg": "/vinD.jpg", "id": "sales31", "updatedAt" :1511232577}
widgets["sales31"]["data"]["text"] == "Moeslein Nate"
基本上是散列内散列内的散列。您不清楚格式化信息的格式,但您可以这样做:
widgets = Sinatra::Application.settings.history
widgets.each do |key, val|
puts "widgets[#{key}][#{val.keys[0]}] = #{val[valkeys[0]]["text"]}"
end
#=> "widgets["sales31"]["data"] = Moeslein Nate"
现在这不是最漂亮的方式,但是由于你要求一个程序化的解决方案,它可以在不明确命名散列键的情况下完成工作。如果它适合你,它可以简化为:
widgets = Sinatra::Application.settings.history
widgets.each do |key, val|
puts "widgets[#{key}]["data"] = #{val["data"]["text"]}"
end
更新:
感谢@marmeladze评论,我发现方法deep_symbolize_keys
可以与!
一起使用,根据您的喜好修改原文。我会做类似的事情:
my_widgets = widgets.deep_symbolize_keys
my_widgets = Sinatra::Application.settings.history
my_widgets.each do |key, val|
puts "widgets[#{key}][:data] = #{val[:data][:text]}"
end
除非您需要,否则不要混合键类型对我来说似乎更干净。