2012-07-16 24 views
6

tôi đang làm việc với một hash gọi my_hash:Mapping để Keys của một Hash

{"2011-02-01 00:00:00+00"=>816, "2011-01-01 00:00:00+00"=>58, "2011-03-01 00:00:00+00"=>241} 

Trước tiên, tôi cố gắng phân tích tất cả các phím, trong my_hash (mà lần).

my_hash.keys.sort.each do |key| 
    parsed_keys << Date.parse(key).to_s 
end 

nào mang lại cho tôi điều này:

["2011-01-01", "2011-02-01", "2011-03-01"] 

Sau đó, tôi cố gắng để ánh xạ parsed_keys lại cho các phím của my_hash:

Hash[my_hash.map {|k,v| [parsed_keys[k], v]}] 

Nhưng đó trả về lỗi sau :

TypeError: can't convert String into Integer 

Làm cách nào để tôi có thể ánh xạ parsed_keys quay lại các phím của my_hash?

Mục đích của tôi là loại bỏ "00: 00: 00 + 00" ở cuối tất cả các phím.

+1

Vấn đề là 'parsed_keys' là một mảng, và' parsed_keys [k] 'là chỉ mục trong một mảng, vì vậy Ruby mong bạn sử dụng một chỉ mục, không phải là một String. Nếu bạn thực sự muốn giữ mã của bạn giống nhau, hãy làm cho 'parsed_keys' một hash cũng được thiết lập như sau:' parsed_keys [key] = Date.parse (khóa) .to_s'. – MrDanA

+0

Hãy để tôi thử điều này. Cám ơn rất nhiều ! – Myxtic

Trả lời

17

Tại sao bạn không làm điều này?

my_hash.map{|k,v| {k.gsub(" 00:00:00+00","") => v}}.reduce(:merge) 

này mang đến cho bạn

{"2011-02-01"=>816, "2011-01-01"=>58, "2011-03-01"=>241} 
+0

Vâng, đó là một ý tưởng tuyệt vời. Nhưng chuỗi là "00:00:00" tại một số địa điểm và "00: 00: 00 + 00" ở những nơi khác. Tôi có thể loại bỏ cả hai chuỗi này bằng cách sử dụng cùng một đoạn mã? – Myxtic

+0

Thử cụm từ thông dụng. 'my_hash.map {| k, v | {k.gsub (/. + $ /, "") => v}}. giảm (: hợp nhất) 'Thao tác này xóa mọi thứ sau dấu cách. – iblue

+0

Điều đó đã làm được! Cảm ơn ! – Myxtic

3

Sử dụng iblue câu trả lời, bạn có thể sử dụng một regexp để xử lý tình trạng này, ví dụ:

pattern = /00:00:00(\+00)+/ 
my_hash.map{|k,v| {k.gsub(pattern,"") => v}}.reduce(:merge) 

Bạn có thể cải thiện các mô hình để xử lý Những tình huống khác nhau.

Hy vọng điều đó sẽ hữu ích.

Edit:

Xin lỗi, iblue đã đăng tải câu trả lời

+0

Điều này sẽ để lại một khoảng trắng trong khóa ('" 2011-01-01 "') – iblue

+0

yep, bạn nói đúng, mẫu phải là/00:00:00 (\ + 00) +/:) –

+0

Cảm ơn cho một giải pháp khác Juan. – Myxtic