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

除非需要,否则不要混合键类型对我来说似乎更干净。