値の配列へのRubyハッシュ


118

私はこれを持っています:

hash  = { "a"=>["a", "b", "c"], "b"=>["b", "c"] } 

そして私はこれに行きたいです: [["a","b","c"],["b","c"]]

これはうまくいくようですが、うまくいきません:

hash.each{|key,value| value}
=> {"a"=>["a", "b", "c"], "b"=>["b", "c"]} 

助言がありますか?


以下の答えは正解です(hash.valuesより優れたIMOです)。しかし、ブロックを指定Hash#eachすると、ハッシュの完全な値が返されることを指摘したかったのです。各アイテムに対して操作を実行し、それを配列として返す場合は、Hash#collectまたはそのエイリアスを使用しますHash#map。Enumerablesについては、こちらをご覧ください
brymck

3
この質問は奇妙に見覚えがあります...何人の人が今同じ宿題に取り組んでいるのでしょうか。
Peter Brown

回答:


260

また、少し単純な...

>> hash = { "a"=>["a", "b", "c"], "b"=>["b", "c"] }
=> {"a"=>["a", "b", "c"], "b"=>["b", "c"]}
>> hash.values
=> [["a", "b", "c"], ["b", "c"]]

Rubyドキュメントはこちら


3
+!気の利いた!(を使用してmap)競合する回答があるにもかかわらず、賛成票を投じます。
Michael Durrant

2
Hash#valuesシンプルであるだけでなく、より効率的です。比較time ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.values'してtime ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.map{|k,v| v}'
jordanbtucker

+1(私があなたのコードを試した後、驚くほどまばゆいばかりでした)私は運が悪いのに1日を費やして、多くの方法を使用してインデックスを削除しました... :D
ローマ8.38-39 2014年

2
キーは発生した順序で印刷されていますか?
stack1

42

私は使うだろう:

hash.map { |key, value| value }

3
反対投票はしませんでしたが、と同じくらい複雑ですHash#values
Mark Thomas

1
はい、私はレイの答えも賛成しました。私も気に入った場合は、競合する回答に賛成票を投じさせていただきます。
Michael Durrant

3
私たちはここで競争しているのではなく、お互いを助け合っていると思いますよね?:)
witkacy26

キーを値として使用してハッシュから配列を作成しようとしたときに、まさに私が探していたもの。ありがとう:)
Fabian Leutgeb 2016年

キーと同時にいくつかのロジックも実行する必要がある場合に役立ちます。
Chris Cirefice

22
hash.collect { |k, v| v }
#returns [["a", "b", "c"], ["b", "c"]] 

Enumerable#collectブロックを取り、enumerableのすべての要素でブロックを実行した結果の配列を返します。したがって、このコードはキーを無視し、すべての値の配列を返します。

Enumerableモジュールはかなり素晴らしいです。それをよく理解することで、多くの時間と多くのコードを節約できます。


2
@Ray Toalの答えのように、hash.valuesここでは最終的に正しい答えであることを忘れないでください。
tadman

またはhash.map(&:second):)
Jaap Haagmans 2015年


4

それはと同じくらい簡単です

hash.values
#=> [["a", "b", "c"], ["b", "c"]]

これにより、ハッシュの値が入力された新しい配列が返されます

新しい配列を保存したい場合は

array_of_values = hash.values
#=> [["a", "b", "c"], ["b", "c"]]

array_of_values
 #=> [["a", "b", "c"], ["b", "c"]]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.