2009-04-11 37 views
16

Tôi có hai mảng như thế này:Chuyển đổi một loạt các phím và một loạt các giá trị vào một hash trong Ruby

keys = ['a', 'b', 'c'] 
values = [1, 2, 3] 

Có một cách đơn giản trong Ruby để chuyển đổi những mảng vào băm sau đây?

{ 'a' => 1, 'b' => 2, 'c' => 3 } 

Đây là cách tôi làm, nhưng tôi cảm thấy cần có phương pháp tích hợp để dễ dàng thực hiện việc này.

def arrays2hash(keys, values) 
    hash = {} 
    0.upto(keys.length - 1) do |i| 
     hash[keys[i]] = values[i] 
    end 
    hash 
end 

Trả lời

50

Các tác phẩm sau đây trong 1.8.7:

keys = ["a", "b", "c"] 
values = [1, 2, 3] 
zipped = keys.zip(values) 
=> [["a", 1], ["b", 2], ["c", 3]] 
Hash[zipped] 
=> {"a"=>1, "b"=>2, "c"=>3} 

này không xuất hiện để làm việc trong các phiên bản cũ của Ruby (1.8.6). Sau đây cần được tương thích ngược:

Hash[*keys.zip(values).flatten] 
+2

Vậy Hash [keys.zip (values)] sau đó? –

+0

Cảm ơn, phương pháp zip có lẽ là những gì tôi cần ... nhưng phần "Hash [zipped]" cho tôi một lỗi trong Ruby 1.8.6: "ArgumentError: số lẻ đối số cho Hash". Và tôi không thể tìm ra một cách khác đơn giản để thay đổi 'nén' thành băm ... –

+0

Hmm. Tôi đang sử dụng 1.8.7. Có vẻ như điều này có thể đã được giới thiệu trong 1.8.7. Tôi sẽ chỉnh sửa câu trả lời cho một phiên bản tương thích ngược. –

8

Một cách khác là sử dụng each_with_index:

hash = {} 
keys.each_with_index { |key, index| hash[key] = values[index] } 

hash # => {"a"=>1, "b"=>2, "c"=>3} 
5

Cùng có thể được thực hiện bằng phương pháp Array#transpose. Nếu bạn đang sử dụng phiên bản Ruby> = 2.1, bạn có thể tận dụng lợi thế của phương pháp Array#to_h, nếu không sử dụng người bạn cũ của mình, Hash::[]

keys = ['a', 'b', 'c'] 
values = [1, 2, 3] 
[keys, values].transpose.to_h 
# => {"a"=>1, "b"=>2, "c"=>3} 
Hash[[keys, values].transpose] 
# => {"a"=>1, "b"=>2, "c"=>3} 
0

Hãy thử điều này, theo cách này sau một d sẽ ghi đè lên một cựu c

irb(main):001:0> hash = Hash[[[1,2,3,3], ['a','b','c','d']].transpose] 
=> {1=>"a", 2=>"b", 3=>"d"} 
irb(main):002:0> 
Các vấn đề liên quan