2012-07-16 11 views
6

estoy trabajando con un hash llamado my_hash:Mapeo de las teclas de un 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} 

En primer lugar, trato de analizar todas las claves, en my_hash (que son tiempos).

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

Lo que me da esto:

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

Entonces, intento trazar parsed_keys de nuevo a las teclas de my_hash:

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

Pero que devuelve el siguiente error :

TypeError: can't convert String into Integer 

¿Cómo puedo asignar parsed_keys a las teclas my_hash?

Mi objetivo es deshacerse de "00: 00: 00 + 00" al final de todas las teclas.

+1

El problema es que 'parsed_keys' es una matriz, y' parsed_keys [k] 'está indexando en una matriz, por lo que Ruby espera que uses un índice, no una cadena. Si realmente deseaba mantener el mismo código, convierta a 'parsed_keys' en un hash que se configure como:' parsed_keys [key] = Date.parse (key) .to_s'. – MrDanA

+0

Déjame intentar esto. Muchas gracias ! – Myxtic

Respuesta

17

¿Por qué no haces esto?

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

Esto le da

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

Sí, esa es una gran idea. Pero la cadena es "00:00:00" en algunos lugares y "00: 00: 00 + 00" en otros. ¿Puedo deshacerme de estas dos cadenas usando el mismo código? – Myxtic

+0

Pruebe expresiones regulares. 'my_hash.map {| k, v | {k.gsub (/. + $ /, "") => v}}. reduce (: fusionar) 'Esto borra todo después de un espacio. – iblue

+0

¡Eso lo hizo! Gracias ! – Myxtic

3

Usando iBlue respuesta, se puede utilizar una expresión regular para manejar esta situación, por ejemplo:

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

Se podría mejorar el patrón de manejar Diferentes situaciones.

Espero que ayude.

Editar:

Lo sentimos, iBlue ya han publicado la respuesta

+0

Esto dejará un espacio en blanco en la clave ('" 2011-01-01 "') – iblue

+0

sí, tienes razón, el patrón debería ser/00:00:00 (\ + 00) +/:) –

+0

Gracias para otra solución Juan. – Myxtic

Cuestiones relacionadas