dgi*_*rez 146
Rails 4.1添加了Hash#compact和Hash#compact!作为Ruby Hash
类的核心扩展.您可以像这样使用它们:
hash = { a: true, b: false, c: nil }
hash.compact
# => { a: true, b: false }
hash
# => { a: true, b: false, c: nil }
hash.compact!
# => { a: true, b: false }
hash
# => { a: true, b: false }
{ c: nil }.compact
# => {}
Run Code Online (Sandbox Code Playgroud)
抬头:这个实现不是递归的.作为一种好奇心,他们使用#select
而不是#delete_if
出于性能原因来实现它.请参阅此处获取基准.
如果你想将它反向移植到你的Rails 3应用程序:
# config/initializers/rails4_backports.rb
class Hash
# as implemented in Rails 4
# File activesupport/lib/active_support/core_ext/hash/compact.rb, line 8
def compact
self.select { |_, value| !value.nil? }
end
end
Run Code Online (Sandbox Code Playgroud)
jpe*_*thy 138
使用hsh.delete_if.在您的具体情况下,例如:hsh.delete_if { |k, v| v.empty? }
ops*_*psb 70
您可以像这样向Hash添加一个紧凑的方法
class Hash
def compact
delete_if { |k, v| v.nil? }
end
end
Run Code Online (Sandbox Code Playgroud)
或者支持递归的版本
class Hash
def compact(opts={})
inject({}) do |new_hash, (k,v)|
if !v.nil?
new_hash[k] = opts[:recurse] && v.class == Hash ? v.compact(opts) : v
end
new_hash
end
end
end
Run Code Online (Sandbox Code Playgroud)
Mar*_*n13 13
如果您使用Rails
(或独立ActiveSupport
),从 version 开始6.1
,有一种compact_blank
方法可以blank
从散列中删除值。
它Object#blank?
在引擎盖下用于确定项目是否为空白。
{ a: "", b: 1, c: nil, d: [], e: false, f: true }.compact_blank
# => { b: 1, f: true }
Run Code Online (Sandbox Code Playgroud)
还可以使用破坏性变体。见Hash#compact_blank!
。
如果您只需要删除nil
值,
请考虑使用 Ruby 内置Hash#compact
和Hash#compact!
方法。
{ a: 1, b: false, c: nil }.compact
# => { a: 1, b: false }
Run Code Online (Sandbox Code Playgroud)
Wil*_*lva 12
如果您使用的是 Ruby 2.4+,则可以调用compact
并compact!
h = { a: 1, b: false, c: nil }
h.compact! #=> { a: 1, b: false }
Run Code Online (Sandbox Code Playgroud)
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.empty? }
hsh.delete_if &swoop
Run Code Online (Sandbox Code Playgroud)
您可以使用Hash#reject从ruby Hash中删除空键/值对.
# Remove empty strings
{ a: 'first', b: '', c: 'third' }.reject { |key,value| value.empty? }
#=> {:a=>"first", :c=>"third"}
# Remove nil
{a: 'first', b: nil, c: 'third'}.reject { |k,v| v.nil? }
# => {:a=>"first", :c=>"third"}
# Remove nil & empty strings
{a: '', b: nil, c: 'third'}.reject { |k,v| v.nil? || v.empty? }
# => {:c=>"third"}
Run Code Online (Sandbox Code Playgroud)
适用于散列和数组
module Helpers
module RecursiveCompact
extend self
def recursive_compact(hash_or_array)
p = proc do |*args|
v = args.last
v.delete_if(&p) if v.respond_to? :delete_if
v.nil? || v.respond_to?(:"empty?") && v.empty?
end
hash_or_array.delete_if(&p)
end
end
end
Run Code Online (Sandbox Code Playgroud)
PS根据某人的回答,找不到
用法 - Helpers::RecursiveCompact.recursive_compact(something)
归档时间: |
|
查看次数: |
91934 次 |
最近记录: |