2017-11-21 14 views
0

私はルビーnoobyのビットですが、何が配列に入れ子になっているハッシュに見えますか?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

と私がしようとすると、ネストされたデータを抽出する場合:Type Error

へ戻る

widgets = Sinatra::Application.settings.history 
widgets.each do |key| 
    puts key[0][:data] 
end 

と今回のキーのちょうど最初の文字を:

widgets = Sinatra::Application.settings.history 
widgets.each do |key| 
    puts key[0][0] 
end 

誰かが最高に精巧でした/私がKEYを使って特定の値を抽出できるようにこのデータを解析するための最も実現可能な方法:

widgets[sales31][text] 
それは実際のテキストを印刷する場所になど

Moeslein Nate 

はお時間をいただき、ありがとうございます!

+0

私はあなたを助けることができると思っていますが、結果がどうなるべきか正確に言うことができますか?ところで、 'each'イテレータは、ブロックに1つの引数が与えられたときに、ハッシュに関して違った働きをします(この場合、' [、、] '配列または2つの引数になります) –

+0

ありがとう、はい、そういう要素に動的にアクセスできるようになっています: ハッシュ[キー] [データ:] [テキスト:]そして返されたテキスト部分: "Moeslein Nate" ハッシュ[キー] [data:] [dataImg:]は "/vinD.jpg"を返すべきです データの下にネストされた値を取得したいと思いますが、ロジックを使用してキーを使用してキー値が一致するようにします! – Shwtm3

+1

あなたのルビーバージョンに基づいているか、または 'activesupport'を依存関係として' transform_keys! 'を使うことができます。したがって、すべてのキーを同じタイプ(例えばシンボル)に正規化することができます – marmeladze

答えて

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 

はUPDATE:私はあなたが好むなら、オリジナルを変更するために!で使用することができる方法をdeep_symbolize_keysたコメントを@marmeladzeする 感謝。私は次のようなことをします:

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 

私が必要としていない限り、キータイプを混ぜないほうがはっきりしているようです。

+0

トンの男に感謝、これは私のためにそれを解決!細部を感謝する!私はまた、次のようにソートすることもできました: 'mySortedHash = myJobsHash.sort_by {| k、v | "#{v ['monthTotals']}"}。逆 ' 乾杯! – Shwtm3

関連する問題