A sintaxe para mapeamento:
a = ["a", "b", "c", "d"] #=> ["a", "b", "c", "d"]
a.map {|item|"a" == item} #=> [true, false, false, false]
a.select {|item|"a" == item} #=> ["a"]
Pergunta, se eu tenho:
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"}
Quero excluir todas as entradas que têm um valor de qty vazio nesta matriz ou selecionar apenas aquelas com algum valor.
Eu tentei:
details.map {|item|"" == item}
Apenas retorna muito falso e então quando eu uso o mesmo, apenas altero o mapa para selecionar Eu obtenho:
[]
:qty
nem aparece lá.Respostas:
Parece
details
uma matriz de hashes. Portanto,item
dentro do seu bloco estará todo o hash. Portanto, para verificar a:qty
chave, você faria algo como o seguinte:Isso lhe dará todos os itens em que a
:qty
chave não é uma string vazia.documentação oficial selecionada
fonte
EDIT: Acabei de perceber que você deseja filtrar
details
, que é uma matriz de hashes. Nesse caso, você poderia fazerA própria estrutura de dados interna não é um Array, mas um Hash. Você também pode usar
select
aqui, mas o bloco recebe a chave e o valor neste caso:Ou usando
reject
, que é o inverso deselect
(exclui todos os itens para os quais a condição dada é válida):Observe que este é Ruby 1.9. Se você precisa manter a compatibilidade com 1.8, você pode fazer:
fonte
details
próprio array.Ao lidar com um hash
{}
, use a chave e o valor para o bloco dentro do||
.fonte