Синтаксис отображения:
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}
Просто возвращает много ложных, а затем, когда я использую то же самое, просто измените карту для выбора, я получаю:
[]
:qty
там даже не фигурирует.Ответы:
Похоже,
details
это массив хешей. Итак,item
внутри вашего блока будет весь хеш. Следовательно, чтобы проверить:qty
ключ, вы должны сделать что-то вроде следующего:Это даст вам все элементы,
:qty
ключ которых не является пустой строкой.официальная документация по выбору
источник
РЕДАКТИРОВАТЬ: я только что понял, что вы хотите отфильтровать
details
массив хешей. В этом случае вы могли бы сделатьСама внутренняя структура данных - это не массив, а хэш. Вы также можете использовать
select
здесь, но в этом случае блоку присваиваются ключ и значение:Или используя
reject
, что является обратнымselect
(исключает все элементы, для которых выполняется данное условие):Обратите внимание, что это Ruby 1.9. Если вам нужно поддерживать совместимость с 1.8, вы можете сделать:
источник
details
массив.При работе с хешем
{}
используйте как ключ, так и значение блока внутри||
.источник