2012-01-27 9 views
2
[[{"Postponed"=>10}], [{"Low"=>3}], [{"Medium"=>4}], [{"High"=>5}]] 

の配列を操作する方法、私は特定の値に対応する値を得ることができますどのように配列ハッシュ

です。

と言っています。これではHighが5を返します。 またはこの配列のハッシュを配列に変換して検索が容易になる仕組み

私が試した:

find_all { |v| v['name'] == "Low" } 

をそれは言う:

cant convert String to Integer 

いくつかのガイダンス

このことについてどのように
+0

最適な解決策(IMHO)は、その構造の作成方法を変更することです。それを行う能力はありますか? –

+0

はい私はそれを行う能力があります、あなたはそれを通して私を導くことができますか? –

+0

普通のハッシュのような臭い: 'status = {"延期 "=> 10、"低 "=> 3、"中 "=> 4、"高 "=> 5} – dgasper

答えて

1

お持ちの場合のように、いくつかのコード:

hash = array.inject({}) {|h, e| h.merge(e.first) } 
# => {"Postponed"=>10, "Low"=>3, "Medium"=>4, "High"=>5} 

だからあなたは簡単に '低' 値を見つけることができます:次に

array = [[{"Postponed"=>10}], [{"Low"=>3}], [{"Medium"=>4}], [{"High"=>5}]] 

ルビーハッシュにそれを回す

hash['Low'] 
# => 3 

編集:マーク・トーマスの答えはかなり素晴らしいです。同じことをするので、注射よりも短い。彼は私が答える前にそれを書きました。ニース;)

0

を提供してください?

arr = [ 
    [{"Postponed"=>10}], 
    [{"Low"=>3}], 
    [{"Medium"=>4}], 
    [{"High"=>5}] 
    ] 
    arr1 = [] 

    arr.each{|a| 
    arr1.push(a[0]) 
    } 

あなたが本当にちょうどあなたがそのように行うだろう1つのハッシュを、取得したい場合、私は疑問に思うけれども:

myHash = {} 

    arr.each{|a| 
    a[0].each{|b, c| 
     myHash[b] = c 
    } 
    } 

あなたはその後、一般的なケースではmyHash["Postponed"]

+0

そしてarr1のキーの値をどう取得するのですか? –

+0

私はそれを実現しました。私はあなたがハッシュを使う方が良いと思う(私のその後の編集を参照)。最初に配列を要求したのでarr1しか提供しませんでした。 – SimonMayer

+0

あなたの迅速な対応のためにthnx Simon! –

1

のようにそれにアクセスしますハッシュはユニークではないので、インデックスを使用して選択するのではなくフィルタリングする必要があります。たとえば、あなたがこれを持って言わせて:

さて、あなたは:coconutキーで任意のハッシュに対応する値を取得したいとしましょう。次に使用してください:

arr.flatten.map { |h| h[:coconut] }.compact 
# => ["ghi"] 

それはあなたに答えのリストを提供します。この場合、一致するキーは1つだけなので、配列には1つのエントリしかありません。持っていた他のハッシュがあった場合:そこにココナッツキーを、あなたのようなものがあるだろう。全体的に

# => ["ghi", "jkl", "mno"] 

を、しかし、それは持っていることは非常に珍しいのデータ構造です。構造体を制御する場合は、ハッシュではなく、好きなようにわかりやすい答えを返すことができるオブジェクトの使用を検討する必要があります。

+0

まあ、thnx @ジョン。それは働いた。また、その構造を変更する方法を教えてもらえますか?あなたの例では、私はarrをこのようなものに変換したいと思う[{:apple => 'abc'}、{:banana => 'def'}] ..ハッシュの配列ではなく普通のハッシュを意味する –

+0

あなたの例まだハッシュの配列です。 (元の構造体はハッシュの配列の配列です) 'arr.flatten'で今説明した内容を得ることができます。 –

0

元の配列で#flattenと呼ぶことができます。それはあなたにハッシュの配列を与えるでしょう。あなたが本当に欲しいと思うのは、ただ1つのハッシュだけです。

1.8.7 :006 > [[{"Postponed"=>10}], [{"Low"=>3}], [{"Medium"=>4}], [{"High"=>5}]].flatten 
=> [{"Postponed"=>10}, {"Low"=>3}, {"Medium"=>4}, {"High"=>5}] 

私は、元の構造を得るために何をしていますか?それは変更できますか?

+0

thnx Thanatos !! –

9

効率的なクエリのために1つのハッシュを作成することはどうですか?

arr.flatten.reduce(:merge) 

#=> {"Postponed"=>10, "Low"=>3, "Medium"=>4, "High"=>5} 
+0

thnxマーク、ええと答えは役に立ちました:) –