2012-03-05 107 views
91

的陣列我有這樣的:Ruby的哈希值來

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

有什麼建議嗎?

+0

下面的答案是正確的('hash.values'是更好的IMO)。但是我想指出,當你爲'Hash#each'提供一個塊時,它只會返回散列值的全部值。如果您想對每個項目執行操作並將其作爲數組返回,請使用「Hash#collect」或其別名「Hash#map」。更多關於Enumerables的內容[here](http://ruby-doc.org/core-1.9.3/Enumerable.html)。 – brymck

+3

這個問題看起來很奇怪......我想知道現在有多少人正在從事相同的家庭作業。 –

回答

205

而且,簡單一點....

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

Ruby doc here

+3

+!漂亮!儘管我有一個相互競爭的答案(使用'map'),我會滿意的,因爲我非常喜歡這個! –

+2

Hash#values不僅更簡單,而且更高效。比較'ruby -e'(1..1000000).reduce({}){| h,i | h.store我,我; (1..1000000).reduce({}){| h,i | h} .values' h.store我,我; H} .MAP {| K,V | '} – jordanbtucker

+0

+1(我試過你的代碼後驚奇地發現了)我花了一天的時間,沒有運氣用很多方法刪除索引...我只能說非常感謝你! :D –

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

Enumerable#collect取得一個塊,並返回在枚舉的每個元素上運行一次塊的結果數組。所以這段代碼只是忽略這些鍵並返回一個包含所有值的數組。

Enumerable模塊非常棒。瞭解它可以爲您節省大量時間和大量代碼。

+1

不要忘記,就像@Ray Toal的回答一樣,'hash.values'在這裏最終是正確的答案。 – tadman

+0

或'hash.map(&:second)':) –

32

我會用:

hash.map { |key, value| value } 
+0

驚訝於downvote!這工作。我嘗試過這個! –

+2

我沒有降低它的效率,但它相當於'Hash#values'。 –

+1

是的,我也提出了Ray的回答。當我喜歡它時,我很樂意提出一個有競爭力的答案。 –

5
hash = { :a => ["a", "b", "c"], :b => ["b", "c"] } 
hash.values #=> [["a","b","c"],["b","c"]] 
+0

@ karlingen,你爲什麼更新我的評論? – mrded

+0

http://stackoverflow.com/posts/12771873/revisions,因爲你可以看到你的代碼的格式是關閉的 – karlingen

2

也有這樣一句:

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

它爲什麼有效:

&在對象上調用to_proc,並將其作爲塊傳遞給該方法。

something {|i| i.foo } 
something(&:foo) 
+0

爲什麼downvote? – karlingen

+0

它的工作原理。投票:) – kuboon

+0

它是如何工作,你可以解釋請 – jenuine

2

這很簡單,只要

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