Ruby Sinatra Hash嵌套在Array中

时间:2017-11-21 03:16:07

标签: ruby sinatra

我有点红宝石,并且似乎无法掌握,似乎是嵌套在数组中的哈希?!

如果我运行以下内容:

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

感谢您的时间!

1 个答案:

答案 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

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