Ruby Arrays: select (), collect () и map () - PullRequest
95 голосов
/ 29 марта 2012

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

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}

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

[]

Ответы [ 3 ]

112 голосов
/ 29 марта 2012

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

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

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

Официальная документация

22 голосов
/ 29 марта 2012

РЕДАКТИРОВАТЬ: Я только что понял, что вы хотите фильтровать 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? }]
9 голосов
/ 29 марта 2012

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

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

=>[false, false, true, false, false]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...