Ruby Sinatra 哈希嵌套在数组中
Ruby Sinatra Hash nested in Array
我有点ruby菜鸟,似乎无法理解,什么似乎是嵌套在数组中的散列?!
如果我 运行 以下内容:
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
有人可以详细说明 best/most 解析这些数据的可行方法,以便我可以使用 KEY 提取特定值:
widgets[sales31][text]
关于打印实际文本的位置:
Moeslein Nate
感谢您的宝贵时间!
我认为您忽略了在 "data"
中还有另一层哈希的事实
所以正确的访问方式是:
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 是一个散列:
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
除非需要,否则不要混合键类型对我来说似乎更干净。
我有点ruby菜鸟,似乎无法理解,什么似乎是嵌套在数组中的散列?!
如果我 运行 以下内容:
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
有人可以详细说明 best/most 解析这些数据的可行方法,以便我可以使用 KEY 提取特定值:
widgets[sales31][text]
关于打印实际文本的位置:
Moeslein Nate
感谢您的宝贵时间!
我认为您忽略了在 "data"
中还有另一层哈希的事实所以正确的访问方式是:
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 是一个散列:
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
除非需要,否则不要混合键类型对我来说似乎更干净。