2012-03-28 13 views
62

de sintaxis para el mapeo:Rubí matrices: SELECT(), recoger(), y el mapa()

a = ["a", "b", "c", "d"]  #=> ["a", "b", "c", "d"] 
a.map {|item|"a" == item}  #=> [true, false, false, false] 
a.select {|item|"a" == item} #=> ["a"] 

pregunta ¿qué tal si tengo:

irb(main):105:0> details[1] 
=> {:sku=>"507772-B21", :desc=>"HP 1TB 3G SATA 7.2K RPM LFF (3 .", :qty=>"", 
:qty2=>"1", :price=>"5,204.34 P"} 

quiero borrar todos los wich entrada tiene un valor qty vacío en esta matriz, o selecciona solo aquellos con algún valor en ella.

me trataron:

details.map {|item|"" == item} 

sólo devuelve una gran cantidad de falsas. y luego, cuando utilizo el mismo mapa solo cambio para seleccionar consigo:

[] 
+0

Si te fijas bien, parece que se trata de una matriz de valores hash – Emily

+0

@Emily: Muy cierto, me acabo de dar cuenta de eso. La última muestra de código me hizo pensar lo contrario, porque ': qty' ni siquiera aparece allí. –

Respuesta

67

Parece que details es un conjunto de valores hash. Entonces, item dentro de tu bloque será el hash entero. Por lo tanto, para comprobar la clave :qty, que haría algo como lo siguiente:

details.select{ |item| item[:qty] != "" } 

que le dará todos los artículos donde la clave :qty no es una cadena vacía.

6

Cuando se trata de un hash {}, utilice la clave y valor al bloque dentro de la ||.

details.map {|key,item|"" == item} 

=>[false, false, true, false, false] 
16

EDIT: simplemente me di cuenta que desea filtrar details, que es un conjunto de valores hash. En ese caso, usted podría hacer

details.reject { |item| item[:qty].empty? } 

La estructura de datos interna en sí no es una matriz, pero un hash. También puede utilizar select aquí, pero el bloque se da la clave y el valor en este caso:

irb(main):001:0> h = {:sku=>"507772-B21", :desc=>"HP 1TB 3G SATA 7.2K RPM LFF (3 .", :qty=>"", :qty2=>"1", :price=>"5,204.34 P"} 
irb(main):002:0> h.select { |key, value| !value.empty? } 
=> {:sku=>"507772-B21", :desc=>"HP 1TB 3G SATA 7.2K RPM LFF (3 .", 
    :qty2=>"1", :price=>"5,204.34 P"} 

O usando reject, que es la inversa de select (excluye todos los elementos para los que la condición dada posee):

h.reject { |key, value| value.empty? } 

Tenga en cuenta que esto es Ruby 1.9. Si usted tiene que mantener la compatibilidad con 1.8, se podría hacer:

Hash[h.reject { |key, value| value.empty? }] 
+0

@ingalcala: Me acabo de dar cuenta de que mi respuesta no es realmente lo que necesita. Por favor revisa mi edición para saber cómo filtrar la matriz 'details' en sí. –