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?


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


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 }

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.


2
Jangan lupa, seperti jawaban @Ray Toal, hash.valuespada akhirnya adalah jawaban yang benar di sini.
tadman

Atau hash.map(&:second):)
Jaap Haagmans


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"]]

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.