La sintaxis para el mapeo:
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 eliminar todas las entradas que tengan un valor de cantidad vacío en esta matriz o seleccionar solo las que tengan algún valor.
Lo intenté:
details.map {|item|"" == item}
Solo devuelve una gran cantidad de falsos y luego, cuando uso el mismo, simplemente cambio el mapa para seleccionar, obtengo:
[]
:qty
ni siquiera aparece allí.Respuestas:
Parece que
details
es una matriz de hashes. Entonces,item
dentro de su bloque estará todo el hash. Por lo tanto, para verificar la:qty
clave, haría algo como lo siguiente:Eso le dará todos los elementos donde la
:qty
clave no es una cadena vacía.documentación oficial seleccionada
fuente
EDITAR: Me acabo de dar cuenta de que quieres filtrar
details
, que es una matriz de hashes. En ese caso podrías hacerLa estructura de datos interna en sí no es una matriz, sino un hash. También puede usar
select
aquí, pero el bloque recibe la clave y el valor en este caso:O usando
reject
, que es el inverso deselect
(excluye todos los elementos para los que se cumple la condición dada):Tenga en cuenta que esto es Ruby 1.9. Si tiene que mantener la compatibilidad con 1.8, puede hacer:
fuente
details
matriz en sí.Cuando se trata de un hash
{}
, utilice tanto la clave como el valor del bloque dentro del||
.fuente