Değerler dizisine Ruby Hash


118

Bu bende var:

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

ve buna ulaşmak istiyorum: [["a","b","c"],["b","c"]]

İşe yaraması gerekiyor gibi görünüyor ama işe yaramıyor:

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

Baska öneri?


Aşağıdaki cevaplar doğrudur ( hash.valuesdaha iyi IMO). Ama Hash#eachona bir blok verdiğinizde hash'in tam değerini döndüreceğini belirtmek istedim . Her öğe üzerinde bir işlem yapmak ve bunu bir dizi olarak döndürmek istiyorsanız, Hash#collectveya onun takma adını kullanın Hash#map. Numaralandırmalar hakkında daha fazla bilgiyi burada bulabilirsiniz .
brymck

3
Bu soru garip bir şekilde tanıdık geliyor ... Şu anda aynı ev ödevinde kaç kişinin çalıştığını merak ediyorum.
Peter Brown

Yanıtlar:


261

Ayrıca, biraz daha basit ....

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

Ruby doc burada


3
+! Şık! Rakip bir cevaba (kullanarak map) rağmen oy vereceğim , çünkü bunu çok seviyorum!
Michael Durrant 05

2
Hash#valuessadece daha basit değil, aynı zamanda daha verimli. Karşılaştırma time ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.values'iletime ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.map{|k,v| v}'
jordanbtucker

+1 (Kodunuzu denedikten sonra inanılmaz bir şekilde gözümü kamaştırdı) Pek çok yöntem kullanarak indeksi kaldırarak hiç şansım olmadı bir gün geçirdim ... Tek söyleyebileceğim çok teşekkür ederim !!! : D
Romalılar 8.38-39

2
Anahtarlar oluştukları sırayla yazdırılıyor mu?
yığın1

43

Kullanmak istiyorum:

hash.map { |key, value| value }

3
Olumsuz oy vermedim, ama daha karmaşık bir muadili Hash#values.
Mark Thomas

1
Evet, Ray'in cevabını da onayladım. Ben de beğendiğimde rakip bir cevaba oy vermekten mutluyum.
Michael Durrant

3
Sanırım burada rekabet etmiyoruz ama birbirimize yardım ediyoruz, değil mi? :)
witkacy26

Anahtarlarını değerler olarak kullanarak bir hash'den bir dizi oluşturmaya çalışırken tam olarak aradığım şey. Teşekkürler :)
Fabian Leutgeb

Aynı anda tuşlarla biraz mantık yapmanız gerektiğinde kullanışlıdır .
Chris Cirefice

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

Enumerable#collectbir blok alır ve numaralandırılabilir öğenin her elemanı üzerinde bloğu bir kez çalıştırmanın sonuçlarının bir dizisini döndürür. Dolayısıyla bu kod, anahtarları yok sayar ve tüm değerlerin bir dizisini döndürür.

EnumerableModül oldukça harika. Bunu iyi bilmek size çok fazla zaman ve kod kazandırabilir.


2
Unutmayın, @Ray Toal'ın cevabı gibi hash.values, sonuçta burada doğru cevap.
tadman

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


4

Kadar basit

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

bu, hash'den gelen değerlerle doldurulmuş yeni bir dizi döndürecektir

bu yeni diziyi saklamak istiyorsanız

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

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.