Ruby Hash ke berbagai nilai

118

Aku punya ini:

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

dan saya ingin mendapatkan ini: [["a","b","c"],["b","c"]]

Sepertinya ini harus berfungsi tetapi tidak:

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

Ada saran?

tbrooke
sumber
Jawaban di bawah ini benar ( hash.valuesmenjadi IMO yang lebih baik). Tapi saya ingin menunjukkan ketika Anda memberikan blok Hash#eachitu hanya akan mengembalikan nilai penuh dari hash. Jika Anda ingin melakukan operasi pada setiap item dan mengembalikannya sebagai array, gunakan Hash#collectatau aliasnya Hash#map. Lebih banyak hal tentang Enumerables di sini .
brymck
3
Pertanyaan ini anehnya terlihat familier ... Saya ingin tahu berapa banyak orang yang mengerjakan tugas pekerjaan rumah yang sama sekarang.
Peter Brown

Jawaban:

261

Juga, sedikit lebih sederhana ....

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

Dok Ruby di sini

Ray Toal
sumber
3
+! Bagus! Saya akan memberikan suara positif meskipun memiliki jawaban yang bersaing (menggunakan map), karena saya sangat menyukai ini!
Michael Durrant
2
Hash#valuestidak hanya lebih sederhana, tetapi lebih efisien. Bandingkan time ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.values'dengantime ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.map{|k,v| v}'
jordanbtucker
+1 (Terkejut luar biasa setelah saya mencoba kode Anda) Saya menghabiskan satu hari tanpa hasil dengan menghapus indeks menggunakan banyak metode ... Yang bisa saya ucapkan terima kasih banyak !!! : D
Roma 8.38-39
2
Apakah kunci dicetak dengan urutan yang sama persis?
tumpukan1
43

Saya akan menggunakan:

hash.map { |key, value| value }
Michael Durrant
sumber
3
Saya tidak meremehkannya, tapi itu padanan yang lebih rumit dengan Hash#values.
Mark Thomas
1
Ya, saya juga mendukung jawaban Ray. Saya senang untuk memberikan suara positif pada jawaban yang bersaing saat saya menyukainya juga.
Michael Durrant
3
Saya pikir kami tidak berkompetisi di sini tetapi saling membantu, bukan? :)
witkacy26
Persis seperti yang saya cari ketika mencoba membuat array dari hash menggunakan kuncinya sebagai nilai. Terima kasih :)
Fabian Leutgeb
Berguna bila Anda juga perlu melakukan logika dengan tombol pada saat yang bersamaan.
Chris Cirefice
23
hash.collect { |k, v| v }
#returns [["a", "b", "c"], ["b", "c"]] 

Enumerable#collectmengambil satu blok, dan mengembalikan larik hasil menjalankan blok sekali pada setiap elemen enumerable. Jadi kode ini hanya mengabaikan kunci dan mengembalikan array dari semua nilai.

The EnumerableModul cukup mengagumkan. Mengetahuinya dengan baik dapat menghemat banyak waktu dan banyak kode.

jergason.dll
sumber
2
Jangan lupa, seperti jawaban @Ray Toal, hash.valuespada akhirnya adalah jawaban yang benar di sini.
tadman
Atau hash.map(&:second):)
Jaap Haagmans
7
hash  = { :a => ["a", "b", "c"], :b => ["b", "c"] }
hash.values #=> [["a","b","c"],["b","c"]]
mrded
sumber
stackoverflow.com/posts/12771873/revision karena Anda dapat melihat pemformatan kode Anda jauh
karlingen
4

Itu sesederhana

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

ini akan mengembalikan array baru yang diisi dengan nilai dari hash

jika Anda ingin menyimpan array baru itu

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

array_of_values
 #=> [["a", "b", "c"], ["b", "c"]]
Melissa Quintero
sumber
2

Ada juga yang ini:

hash = { foo: "bar", baz: "qux" }
hash.map(&:last) #=> ["bar", "qux"]

Mengapa ini berhasil:

The &panggilan to_procpada objek, dan dibagikan sebagai blok ke metode.

something {|i| i.foo }
something(&:foo)
karlingen
sumber
Penjelasan yang lebih mendalam brianstorti.com/understanding-ruby-idiom-map-with-symbol
Sylvain