Как мне удалить все пустые элементы (пустые элементы списка) из вложенного файла Hash или YAML?
ruby-on-rails
ruby
hash
yaml
Брайан Джордан
источник
источник
Hash#delete_if
это разрушительная операция, в то время какcompact
методы не изменяют объект. Вы можете использоватьHash#reject
. Или вызовите методHash#compact!
.compact
иcompact!
стандартно поставляется в Ruby => 2.4.0 и Rails => 4.1. Они не рекурсивные, хотя.HashWithIndifferentAccess
... Проверьте мою версию на stackoverflow.com/a/53958201/1519240В Rails 4.1 добавлены Hash # compact и Hash # compact! в качестве основного расширения Ruby's
Hash
класса . Вы можете использовать их так:Heads: эта реализация не является рекурсивной. Любопытно, что они реализовали это, используя
#select
вместо#delete_if
по соображениям производительности. Смотрите здесь для сравнения .Если вы хотите перенести его в приложение Rails 3:
источник
Используйте hsh.delete_if . В вашем конкретном случае что-то вроде:
hsh.delete_if { |k, v| v.empty? }
источник
proc = Proc.new { |k, v| v.kind_of?(Hash) ? (v.delete_if(&l); nil) : v.empty? }; hsh.delete_if(&proc)
NoMethodError
еслиv
ноль.Если вы используете Ruby 2.4+, вы можете позвонить
compact
иcompact!
https://ruby-doc.org/core-2.4.0/Hash.html#method-i-compact-21
источник
Этот тоже удалит пустые хэши:
источник
swoop = Proc.new { |k, v| v.delete_if(&swoop) if v.kind_of?(Hash); v.blank? }
Вы можете использовать Hash # reject для удаления пустых пар ключ / значение из рубинового Hash.
источник
.empty?
выдает ошибку для чисел, так что вы можете использовать.blank?
вRails
работает как для хэшей, так и для массивов
PS на основании чьего-то ответа, не могу найти
использование -
Helpers::RecursiveCompact.recursive_compact(something)
источник
Я знаю, что эта ветка немного устарела, но я нашел лучшее решение, которое поддерживает многомерные хеши. Он использует delete_if? кроме его многомерности и очищает что-либо с пустым значением по умолчанию, и если блок передается, он передается через его потомков.
источник
Для этого я создал метод deep_compact, который рекурсивно отфильтровывает ноль записей (и, необязательно, пустые записи):
источник
Руби
Hash#compact
,Hash#compact!
иHash#delete_if!
не работают на вложеннойnil
,empty?
и / илиblank?
значения. Обратите внимание , что последние два метода являются разрушительными, и что всеnil
,""
,false
,[]
и{}
значение, считаютсяblank?
.Hash#compact
иHash#compact!
доступны только в Rails или Ruby версии 2.4.0 и выше.Вот неразрушающее решение, которое удаляет все пустые массивы, хэши, строки и
nil
значения, сохраняя всеfalse
значения:(
blank?
может быть замененnil?
или поempty?
мере необходимости.)Разрушительная версия:
Или, если вы хотите добавить обе версии в качестве методов экземпляра в
Hash
классе:Другие варианты:
v.blank? && v != false
на,v.nil? || v == ""
чтобы строго удалить пустые строки иnil
значенияv.blank? && v != false
на,v.nil?
чтобы строго удалитьnil
значенияРЕДАКТИРОВАНИЕ 2017/03/15, чтобы сохранить
false
значения и представить другие вариантыисточник
наша версия: он также очищает пустые строки и значения ноль
источник
В Simple один вкладыш для удаления нулевых значений в Hash,
источник
blank?
подходит и для пустых строкМожет быть сделано с библиотекой граней (отсутствующей в стандартной библиотеке):
Работает с любым Enumerable (включая Array, Hash).
Посмотри как реализован рекурсивный метод .
источник
Я считаю, что было бы лучше использовать саморекурсивный метод. Таким образом, он идет так глубоко, как необходимо. Это удалит пару ключ-значение, если значение равно нулю или пустой хэш.
Тогда его использование будет выглядеть так:
Для хранения пустых хешей вы можете упростить это до.
источник
источник
Попробуйте это, чтобы удалить ноль
источник
hash.compact!
Рекурсивная версия https://stackoverflow.com/a/14773555/1519240 работает, но не с
HashWithIndifferentAccess
другими классами, которые являются своего рода Hash.Вот версия, которую я использую:
kind_of?(Hash)
будет принимать больше классов, которые похожи на хэш.Вы также можете заменить
inject({})
на,inject(HashWithIndifferentAccess.new)
если хотите получить доступ к новому хешу, используя как символ, так и строку.источник
Вот что у меня есть:
источник
Глубокое удаление нулевых значений из хеша.
источник
Если вы используете
Rails
(или автономноActiveSupport
), начиная с версии6.1
, естьcompact_blank
метод, который удаляетblank
значения из хэшей.Он использует
Object#blank?
под капотом для определения, если элемент пуст.Вот ссылка на документы и ссылка на соответствующий PR .
Разрушительный вариант также доступен. См
Hash#compact_blank!
.Если вам нужно удалить только
nil
значения,пожалуйста, рассмотрите возможность использования встроенных в Ruby методов
Hash#compact
иHash#compact!
методов.источник