Ruby Arrays: select(), collect() и map()

синтаксис для отображения:

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

вопрос о том, если у меня есть:

 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"}

Я хочу удалить каждую запись, у которой есть пустое значение qty в этом массиве, или выбрать только те, у кого есть какое-то значение.

Я пробовал:

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

просто возвращает много false. а затем, когда я использую одну и ту же карту изменения, чтобы выбрать, я получаю:

[]

Ответ 1

Похоже, что details - это массив хэшей. Таким образом, item внутри вашего блока будет весь хеш. Поэтому, чтобы проверить ключ :qty, вы сделали бы что-то вроде следующего:

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

Это даст вам все элементы, где ключ :qty не является пустой строкой.

Ответ 2

EDIT: Я просто понял, что вы хотите отфильтровать details, который представляет собой массив хэшей. В этом случае вы могли бы сделать

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

Сама внутренняя структура данных - это не массив, а хэш. Вы также можете использовать select здесь, но в этом блоке указывается ключ и значение:

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"}

Или используя reject, который является обратным к select (исключая все элементы, для которых выполняется данное условие):

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

Обратите внимание, что это Ruby 1.9. Если вам нужно поддерживать совместимость с 1.8, вы можете сделать:

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

Ответ 3

При работе с хэшем {} используйте ключ и значение для блока внутри ||.

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

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