Ruby Hash thành mảng giá trị


118

Tôi có cái này:

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

và tôi muốn đạt được điều này: [["a","b","c"],["b","c"]]

Điều này có vẻ như nó sẽ hoạt động nhưng nó không:

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

Bất kỳ đề xuất?


Các câu trả lời dưới đây là đúng ( hash.valueslà IMO tốt hơn). Nhưng tôi muốn chỉ ra rằng khi bạn cung cấp một khối cho Hash#eachnó sẽ chỉ trả về giá trị đầy đủ của hàm băm. Nếu bạn muốn thực hiện một thao tác trên từng mục và trả về dưới dạng một mảng, hãy sử dụng Hash#collecthoặc bí danh của nó Hash#map. Thêm nội dung trên Enumerables tại đây .
brymck

3
Câu hỏi này trông quen thuộc một cách kỳ lạ ... Không biết bây giờ có bao nhiêu người đang làm cùng một bài tập về nhà.
Peter Brown

Câu trả lời:


260

Ngoài ra, đơn giản hơn một chút….

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

Tài liệu Ruby ở đây


3
+! Xấu! Tôi sẽ ủng hộ mặc dù có một câu trả lời cạnh tranh (sử dụng map), vì tôi thích điều này rất nhiều!
Michael Durrant

2
Hash#valueskhông chỉ đơn giản hơn mà còn hiệu quả hơn. Hãy so sánh time ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.values'vớitime ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.map{|k,v| v}'
jordanbtucker

+1 (Lóa mắt một cách đáng kinh ngạc sau khi tôi thử mã của bạn) Tôi đã dành một ngày không may mắn khi xóa chỉ mục bằng nhiều phương pháp ... Tất cả những gì tôi có thể nói, cảm ơn bạn rất nhiều !!! : D
Rô-ma 8,38-39

2
Các phím có được in theo thứ tự chính xác mà chúng xuất hiện không?
stack1

42

Tôi sẽ dùng:

hash.map { |key, value| value }

3
Tôi không phản đối nó, nhưng nó phức tạp hơn tương đương với Hash#values.
Mark Thomas

1
Vâng, tôi cũng ủng hộ câu trả lời của Ray. Tôi rất vui khi ủng hộ một câu trả lời cạnh tranh khi tôi cũng thích nó.
Michael Durrant

3
Tôi nghĩ chúng ta không cạnh tranh ở đây mà là giúp đỡ lẫn nhau, phải không? :)
witkacy26

Chính xác những gì tôi đang tìm kiếm khi cố gắng tạo một mảng từ một hàm băm bằng cách sử dụng các khóa của nó làm giá trị. Cảm ơn :)
Fabian Leutgeb

Hữu ích khi bạn cần thực hiện một số logic với các phím cùng một lúc.
Chris Cirefice

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

Enumerable#collectlấy một khối và trả về một mảng kết quả của việc chạy khối một lần trên mọi phần tử của liệt kê. Vì vậy, mã này chỉ bỏ qua các khóa và trả về một mảng tất cả các giá trị.

Các Enumerablemô-đun là khá tuyệt vời. Biết rõ về nó có thể giúp bạn tiết kiệm rất nhiều thời gian và rất nhiều mã.


2
Đừng quên rằng, giống như câu trả lời của @Ray Toal, hash.valuescuối cùng là câu trả lời chính xác ở đây.
tadman

Hoặc hash.map(&:second):)
Jaap Haagmans


4

Nó đơn giản như

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

điều này sẽ trả về một mảng mới được điền các giá trị từ hàm băm

nếu bạn muốn lưu trữ mảng mới đó, hãy làm

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

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.