Ruby Hash เป็นอาร์เรย์ของค่า


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

คำตอบ:


261

ง่ายกว่าเล็กน้อย ....

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

Ruby doc ที่นี่


3
+! Nifty! ฉันจะโหวตให้คะแนนแม้ว่าจะมีคำตอบที่แข่งขันกัน (โดยใช้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 (ตื่นตาอย่างน่าอัศจรรย์หลังจากที่ฉันลองใช้รหัสของคุณ) ฉันใช้เวลาหนึ่งวันโดยไม่มีโชคในการลบดัชนีโดยใช้หลายวิธี ... ทั้งหมดที่ฉันสามารถพูดได้ขอบคุณมาก !!! : D
โรม 8.38-39

2
คีย์ถูกพิมพ์ตามลำดับที่เกิดขึ้นหรือไม่?
stack1

43

ฉันจะใช้:

hash.map { |key, value| value }

3
ฉันไม่ได้ลงคะแนน แต่มันซับซ้อนกว่าที่เทียบเท่ากับHash#values.
Mark Thomas

1
ใช่ฉันโหวตคำตอบของเรย์ด้วย ฉันยินดีที่จะโหวตคำตอบของคู่แข่งเมื่อฉันชอบมันเช่นกัน
Michael Durrant

3
ฉันคิดว่าเราไม่ได้แข่งขันกันที่นี่ แต่ช่วยกันใช่ไหม? :)
witkacy26

สิ่งที่ฉันกำลังมองหาเมื่อพยายามสร้างอาร์เรย์จากแฮชโดยใช้คีย์เป็นค่า ขอบคุณ :)
Fabian Leutgeb

มีประโยชน์เมื่อคุณต้องใช้ตรรกะบางอย่างกับคีย์ในเวลาเดียวกัน
Chris Cirefice

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

Enumerable#collectรับบล็อกและส่งกลับอาร์เรย์ของผลลัพธ์ของการรันบล็อกหนึ่งครั้งในทุกองค์ประกอบของตัวนับ ดังนั้นรหัสนี้จะละเว้นคีย์และส่งคืนอาร์เรย์ของค่าทั้งหมด

Enumerableโมดูลจะน่ากลัวสวย การรู้ดีสามารถช่วยคุณประหยัดเวลาและโค้ดได้มากมาย


2
อย่าลืมว่าเช่นเดียวกับคำตอบของ @Ray Toal คือคำตอบhash.valuesที่ถูกต้องที่สุดที่นี่
tadman

หรือhash.map(&:second):)
Jaap Haagmans


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

2

นอกจากนี้ยังมีสิ่งนี้:

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

ทำไมมันถึงได้ผล:

&เรียกto_procบนวัตถุและผ่านมันเป็นบล็อกที่วิธีการ

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

คำอธิบายเชิงลึกเพิ่มเติมbrianstorti.com/understand-ruby-idiom-map-with-symbol
Sylvain
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.