Forum: Rails-ES HASH SELECT de los indices en un ARRAY

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
B5a971402dcbee6f4472dabc4eeaf496?d=identicon&s=25 Rafa Colom (rpcolom)
on 2009-06-03 12:02
Hola, a todos.

Estoy probando de seleccionar los registros de un HASH que estan
indicados en un ARRAY y que retorne un HASH con los registros
seleccionados.

fields=['DNI', 'ID', 'NOMCOM']
data={:DNI => "444444444Q", :ID => 123, :NOMCOM => "nombre comercial del
123", :DIRECTOR => "Director del 123"}

EJEMPLO1:
fields.each { |field| data.select {|k,v| k==field.to_sym }}

Evidentemente, al hacer la instruccion anterior, me devuelve solo las
keys.

A partir de aqui he visto que la instruccion debe partir del HAS.SELECT,
como:

EJEMPLO2:
data.select {|k,v| k==fields[0].to_sym}

Pero no he sabido como buclar el array fields dentro del bloque del
select.


Como se puede hacer para que devuelva un array de parejas key,value (en
el ejemplo1) o para que devuelva un HASH con los registros seleccionados
(en el ejemplo 2)?

Muchas gracias.
Rafa.
B41d652ca9b88e636516d907599dcc87?d=identicon&s=25 Juan Gallego galisteo (nickel83)
on 2009-06-03 12:26
(Received via mailing list)
Te doy una alternativa, a ver que te parece..

fields.inject({}){|hash, field| hash[field.to_sym] = data[field.to_sym];
hash}

Espero haber entendido el problema :-)

Suerte,
Juan.


2009/6/3 Rafa Colom <ruby-forum-incoming@andreas-s.net>
B5a971402dcbee6f4472dabc4eeaf496?d=identicon&s=25 Rafa Colom (rpcolom)
on 2009-06-03 12:52
Juan Gallego galisteo wrote:
> Te doy una alternativa, a ver que te parece..
>
> fields.inject({}){|hash, field| hash[field.to_sym] = data[field.to_sym];
> hash}
>
> Espero haber entendido el problema :-)
>
> Suerte,
> Juan.
>
>
> 2009/6/3 Rafa Colom <ruby-forum-incoming@andreas-s.net>

Me has entendido perfectamente. Pero me gustaria hacerte otra pegunta.
Por que
si ejecuto el codigo anterior sin ';hash' en el irb da un error? No
deberia de retornar 'hash' que es la nueva variable definida en inject?

fields.inject({}){|hash, field| hash[field.to_sym] = data[field.to_sym]}
B41d652ca9b88e636516d907599dcc87?d=identicon&s=25 Juan Gallego galisteo (nickel83)
on 2009-06-03 13:10
(Received via mailing list)
Básicamente por la forma en la que trabaja el método inject. El valor
conel
que va trabajando es el resultado de la iteración anterior. El primero
esta
inicializado con inject(*{}*).

Fíjate que pasa si haces hash[:uno] = 1 en irb; te devuelve 1, verdad?
Dentro
del inject, en la siguiente iteración, usarías ese 1 como hash y
obtendrás
un
fantástico error :-)

Devolviendo explícitamente el hash subsanamos el problema :-)

Te lo he aclarado algo?

Un saludo,
Juan.


2009/6/3 Rafa Colom <ruby-forum-incoming@andreas-s.net>
Ba6e83f1628194a060613026a33d8881?d=identicon&s=25 Isaac Feliu Pérez (Guest)
on 2009-06-03 13:21
(Received via mailing list)
Buenas,

otro método un poco más "sencillo":

data.reject {|k,v| !fields.include?(k.to_s)}

Básicamente reject devuelve un hash con los elementos "descartados"
por el bloque, o sea que si descartas las keys que tienes en el array,
de devuelve el hash que esperas.

Espero te sirva de ayuda!

Saludos,
--
Isaac Feliu
B5a971402dcbee6f4472dabc4eeaf496?d=identicon&s=25 Rafa Colom (rpcolom)
on 2009-06-03 13:22
Juan Gallego galisteo wrote:
> Básicamente por la forma en la que trabaja el método inject. El valor
> conel
> que va trabajando es el resultado de la iteración anterior. El primero
> esta
> inicializado con inject(*{}*).
>
> Fíjate que pasa si haces hash[:uno] = 1 en irb; te devuelve 1, verdad?
> Dentro
> del inject, en la siguiente iteración, usarías ese 1 como hash y
> obtendrás
> un
> fantástico error :-)
>
> Devolviendo explícitamente el hash subsanamos el problema :-)
>
> Te lo he aclarado algo?
>
> Un saludo,
> Juan.
>
>
> 2009/6/3 Rafa Colom <ruby-forum-incoming@andreas-s.net>


Entendido y muchas gracias.
Rafa.
45742831d67c80d12cd7b24907b8d760?d=identicon&s=25 Sergio Gil Pérez de la Manga (Guest)
on 2009-06-03 16:34
(Received via mailing list)
2009/6/3 Rafa Colom <ruby-forum-incoming@andreas-s.net>:
>
> Entendido y muchas gracias.
> Rafa.
>

Si estás en Rails, active support define Hash#slice que es exactamente
lo que quieres:

>> {:foo => 1, :bar => 'paco', :wadus => true}.slice(:bar, :wadus)
=> {:wadus=>true, :bar=>"paco"}

--
Sergio Gil Pérez de la Manga
e-mail > sgilperez@gmail.com
blog > http://www.lacoctelera.com/porras
now > http://twitter.com/porras
B5a971402dcbee6f4472dabc4eeaf496?d=identicon&s=25 Rafa Colom (rpcolom)
on 2009-06-04 10:12
Sergio Gil Pérez de la Manga wrote:
> 2009/6/3 Rafa Colom <ruby-forum-incoming@andreas-s.net>:
>>
>> Entendido y muchas gracias.
>> Rafa.
>>
>
> Si est�s en Rails, active support define Hash#slice que es exactamente
> lo que quieres:
>
>>> {:foo => 1, :bar => 'paco', :wadus => true}.slice(:bar, :wadus)
> => {:wadus=>true, :bar=>"paco"}
>
> --
> Sergio Gil P�rez de la Manga
> e-mail > sgilperez@gmail.com
> blog > http://www.lacoctelera.com/porras
> now > http://twitter.com/porras

fields=['DNI', 'ID', 'NOMCOM']
data={:DNI => "444444444Q", :ID => 123, :NOMCOM => "nombre comercial del
123", :DIRECTOR => "Director del 123"}

Pero como puedo buclar el array fields en el parametro slice
data.slice(fields.each do {|x| x.to_sym}) (?)
45742831d67c80d12cd7b24907b8d760?d=identicon&s=25 Sergio Gil Pérez de la Manga (Guest)
on 2009-06-04 10:27
(Received via mailing list)
On Thu, Jun 4, 2009 at 10:12 AM, Rafa Colom
<ruby-forum-incoming@andreas-s.net> wrote:
>>>> {:foo => 1, :bar => 'paco', :wadus => true}.slice(:bar, :wadus)
> 123", :DIRECTOR => "Director del 123"}
>
> Pero como puedo buclar el array fields en el parametro slice
> data.slice(fields.each do {|x| x.to_sym}) (?)
>

data.slice(*fields)

http://4loc.wordpress.com/2009/01/16/the-splat-ope...


--
Sergio Gil Pérez de la Manga
e-mail > sgilperez@gmail.com
blog > http://www.lacoctelera.com/porras
now > http://twitter.com/porras
19a57587ed8a3a6366b419723b516063?d=identicon&s=25 Jorge Calás Lozano (Guest)
on 2009-06-06 02:25
(Received via mailing list)
Sergio Gil Pérez de la Manga wrote:
>>>>> {:foo => 1, :bar => 'paco', :wadus => true}.slice(:bar, :wadus)
>>
>> Pero como puedo buclar el array fields en el parametro slice
>> data.slice(fields.each do {|x| x.to_sym}) (?)
>>
>
> data.slice(*fields)
>
> http://4loc.wordpress.com/2009/01/16/the-splat-ope...
>
>

data.slice(*fields.collect{|f| f.to_sym})

o (ya que estamos con activesupport)

data.stringify_keys.slice(*fields)
This topic is locked and can not be replied to.