Ruby Arrays: виберіть (), збирайте () та картографуйте ()


106

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

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}

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

[]

Якщо придивитися уважно, то схоже, що це масив хешей
Емілі,

@Emily: Дуже правда, я щойно це зрозумів. Останній зразок коду змусив мене думати інакше, тому :qtyщо навіть там не з’являється.
Ніклас Б.

Відповіді:


131

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

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

Це дасть вам усі елементи, де :qtyключ не порожній рядок.

офіційна відбіркова документація


26

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? }]

@ingalcala: Я щойно зрозумів, що моя відповідь насправді не те, що потрібно. Будь ласка, перевірте мою редакцію, як фільтрувати detailsмасив.
Ніклас Б.

9

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

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

=>[false, false, true, false, false]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.