синтаксис для отображения:
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]