2013-10-02 4 views
9

Я использую Ruby on Rails 3.2.13, и я хотел бы удалить хеш-ключи, соответствующие значению хэша. То есть, если у меня есть следующий хэшКак удалить хеш-ключи, значение хэша пустое?

{ :a => 0, :b => 1, :c => true, :d => "", :e => " ", :f => nil } 

затем полученный хэш должен быть (примечание: 0 и true не считаются пустыми)

{ :a => 0, :b => 1, :c => true } 

Как я могу сделать это?

+0

вы хотите сохранить 'Do? –

ответ

22

Если с помощью Rails, вы можете попробовать

hash.delete_if { |key, value| value.blank? } 

или в случае только Руби

hash.delete_if { |key, value| value.to_s.strip == '' } 
+3

'value.to_s.strip.empty?' Читает бит лучше, чем '== ''', IMO. Кроме того, вам не нужны Rails для «пустого?», А просто для ActiveSupport. –

+0

Что делать, если значение является хешем, который пуст? или еще один вложенный хеш пуст? –

1

Есть несколько способов решения этой общей задачи

отклонять

Это тот, который я чаще всего использую для очистки хэшей как своих коротких, чистых и достаточно гибких для поддержки любого условного и не мутирует исходный объект. Вот good article о преимуществах неизменности в рубине.

hash.reject {|_,v| v.blank?} 

Примечание: Подчеркивание в приведенном выше примере используется для указания того, что мы хотим распаковать кортеж, переданный в прок, но мы не используем первое значение (ключ).

Отклонить!

Однако, если вы хотите, чтобы мутировать исходный объект:

hash.reject! {|_,v| v.blank?} 

выберите

С другой стороны, вы используете выбор, который будет возвращать только те значения, которые возвращают истинное при оценке

hash.select {|_,v| v.present? } 

Выбрать!

... и мутирует версия

hash.select {|_,v| v.present? } 

компактный

Наконец, когда вы только нужно удалить ключи, которые имеют значения nil ...

hash.compact 

компактный!

Вы уже выбрали шаблон, но это версия, которая модифицирует оригинальный хэш!

hash.compact! 
0

Что касается решения techvineet, обратите внимание на следующее значение = [].г => [] и `ч => {}`:

[].blank?    => true 
[].to_s.strip == ''  => false 
[].to_s.strip.empty? => false 
Смежные вопросы