Duda array

Buenas, necesito guardar en un array unos valores de un objeto.
Ésto es lo que me llega como parámetros:
Parameters: { “action”=>“create”, “tema”=>{“1”=>“0”, “2”=>“0”, “3”=>“5”,
“4”=>“6”}, “boton”=>“Crear”, “controller”=>“admin/proyectos”,
“locale”=>“es”, “proyecto”=>{…}}

Cómo puedo recoger los valores del objeto “tema” en un array? he probado
a hacer ésto:
@temas=parmas[:tema]
@arr=[]
i=0
for tema in @temas
i=i+1
@arr << tema[i]
end

El debug de @temas me saca:

— !map:HashWithIndifferentAccess
“1”: “0”
“2”: “0”
“3”: “5”
“4”: “6”

Y al hacer el debug de @arr, me saca ésto:


  • “0”

Qué he hecho mal? Necesito guardar en un array los valores,
algún consejo? gracias

Hola,

Buenas, necesito guardar en un array unos valores de un objeto.
Ésto es lo que me llega como parámetros:
Parameters: { “action”=>“create”, “tema”=>{“1”=>“0”, “2”=>“0”, “3”=>“5”,
“4”=>“6”}, “boton”=>“Crear”, “controller”=>“admin/proyectos”,
“locale”=>“es”, “proyecto”=>{…}}

si quieres un array te valdría con hacer params[:tema].values. El
problema de eso es que al ser una Hash no mantienes el orden, y no es lo
que quieres probablemente.

si como parece tienes n valores en la hash que siempre empiezan por 1 y
suben de forma consecutiva, te puede valer esto

tu_array=Array.new(params[:tema].size){|i| params[:tema][(i+1).to_s]}

Eso te crea un array de tantas posiciones como elementos en tema, y te
lo inicializa poniendo en cada índice el valor correspondiente de tema
(para el índice del array 0, le suma 1 lo convierte a cadena y lo busca
en tu hash, y así para todos).

Si no, siempre puedes crear un array vacio y recorrer la hash con un
each_pair, por ejemplo, para asignar luego al array los valores.

Saludos,

javier ramírez

On Aug 30, 2007, at 2:08 PM, Miguel Angel Calleja Lázaro wrote:

a hacer ésto:
— !map:HashWithIndifferentAccess

Qué he hecho mal? Necesito guardar en un array los valores, algún
consejo? gracias

Al margen de la resolucion del thread con la respuesta de Javi, me
intriga lo de arriba.

Esa salida se producia en principio porque las llaves del hash
original son cadenas, mientras que la variable i almacena enteros.
Los hashes de Rails convierten llaves que sean simbolo a cadena, pero
los enteros quedan tal cual. De manera que tema[“1”] es “0”, pero tema
[1] es nil.

Por tanto, esperaria que @arr fuera una array con 4 nils, pero no
acabo de ver porque aparece el “0”. Hmmm… alguien lo ve?

– fxn

javier ramirez
escribió:

Eso te crea un array de tantas posiciones como elementos en tema, y te


Ror-es mailing list
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es

Muchísimas gracias me ha servido de mucho

Hola,

Por tanto, esperaria que @arr fuera una array con 4 nils, pero no
acabo de ver porque aparece el “0”. Hmmm… alguien lo ve?

me has hecho pensar… :wink:

La culpa del asunto está en cómo están implementados los iteradores
sobre una Hash. En un Array, un each o un for te devuelve el valor del
objeto cada vez. Pero en una Hash no es así, presumo que porque tanto la
clave como el valor son significativos. En una Hash cuando iteras con un
each o con un for, te devuelve un array de arrays, teniendo cada Array
dos posiciones, la 0 para la clave y la 1 para el valor.

Lo vemos sobre el código

@temas=parmas[:tema]
@arr=[]
i=0
for tema in @temas

Aquí cuando iteres, cada elemento tema va a ser un Array. La primera
vuelta sería tal que [‘1’,‘0’],la segunda sería [‘2’,‘0’] y la tercera
[‘3’,‘5’]

i=i+1  

ahora en la primera vuelta i vale 1, con lo obtenemos el valor ‘0’, que
es el que veíamos en el debug

@arr << tema[i]
end

En las vueltas dos y tres, la i ya vale 2 y 3. Si buscamos la posición 2
sobre el Array correspondiente al segundo tema que tiene valor [‘2’,‘0’]
nos devolverá un nil, por eso cuando lo asignas a @arr no consigues
nada. Y lo mismo en el tercer tema.

Moraleja, para iterar sobre Hashes es mejor usar each_key, each_value o
each_pair. Por cierto, que si usais un map sobre una Hash os vais a
encontrar con lo mismo.

Saludos,

javier ramírez

On Aug 30, 2007, at 5:42 PM, javier ramirez wrote:

con un
vuelta sería tal que [‘1’,‘0’],la segunda sería [‘2’,‘0’] y la tercera
[‘3’,‘5’]

i=i+1

ahora en la primera vuelta i vale 1, con lo obtenemos el valor ‘0’,
que
es el que veíamos en el debug

Guapo! :slight_smile:

javier ramirez
escribió:

Eso te crea un array de tantas posiciones como elementos en tema, y te


Ror-es mailing list
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es

“tema”=>{“1”=>“0”, “2”=>“0”, “3”=>“5”,“4”=>“6”}

He probado las dos formas y funcionan bien, pero cómo puedo quedarme con
los valores distintos de 0?
@arr=params[:tema].values
@arr=Array.new(params[:tema].size){|i| params[:tema][(i+1).to_s]}

Hola,

“tema”=>{“1”=>“0”, “2”=>“0”, “3”=>“5”,“4”=>“6”}

He probado las dos formas y funcionan bien, pero cómo puedo quedarme con
los valores distintos de 0?
@arr=params[:tema].values
@arr=Array.new(params[:tema].size){|i| params[:tema][(i+1).to_s]}

esta vez no te lo contesto :wink: si llevas idea de programar en ruby/rails
te recomendaría darte un buen repaso a la documentación de algunas
clases básicas. Entre las que me parecen fundamentales tienes String,
Array y Hash.

De todas formas, te lo medio contesto para que no se diga… en tu caso
ya tienes un Array, ahora sólo tienes que conseguir una de dos, o
seleccionar todos los elementos que no sean igual que cero o borrar
todos los que sí lo sean. Si te miras la doc online con estas pistas lo
tienes muy muy fácil :wink:

Ya que estás en la página de la doc, no dejes de mirarte otros métodos
como map que te vendrán perfectos para muchas cosas… y ya que estás no
dejes de mirarte en general el resto de métodos, que siempre se
descubren cosas muy interesantes :slight_smile:

saludos,

j

javier ramirez
escribió:> clases básicas. Entre las que me parecen fundamentales tienes String,

Array y Hash.

+1 a la respuesta de Javi, esas clases son una gozada y merece la pena
echar un vistazo a las funciones disponibles: si te acostumbras a
utilizarlas te ahorrarás muchísimo código (y esfuerzo), además de
ayudarte a comprender el código ajeno.

Saludos,
Raul M.

javier ramirez
escribió:

tienes muy muy fácil :wink:


Ror-es mailing list
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es

Si, perdona :wink: , a veces busco la solución sencilla y peco de preguntar
sin buscar antes, perdonad, buscando lo primero que he contrado con hash
ha sido ésto:
@temas=params[:tema].values
@temas.delete_if {|key,value| key==0}
Debería funcionar

Me empollaré todos estos métodos :wink:

Creo que con ésto podría hacerlo