如何从哈希中删除密钥并在Ruby / Rails中获取剩余的哈希值?
要添加一个新的哈希对我做:
{:a => 1, :b => 2}.merge!({:c => 3}) #=> {:a => 1, :b => 2, :c => 3}
有没有类似的方式从哈希中删除密钥?
这工作:
{:a => 1, :b => 2}.reject! { |k| k == :a } #=> {:b => 2}
但我希望能有这样的东西:
{:a => 1, :b => 2}.delete!(:a) #=> {:b => 2}
重要的是返回值将是剩余的散列值,所以我可以执行如下操作:
foo(my_hash.reject! { |k| k == my_key })
在一行中。
Rails除了/除了! 方法,该方法返回移除了这些键的散列。 如果你已经使用Rails,那么创建你自己的版本是没有意义的。
class Hash
# Returns a hash that includes everything but the given keys.
# hash = { a: true, b: false, c: nil}
# hash.except(:c) # => { a: true, b: false}
# hash # => { a: true, b: false, c: nil}
#
# This is useful for limiting a set of parameters to everything but a few known toggles:
# @person.update(params[:person].except(:admin))
def except(*keys)
dup.except!(*keys)
end
# Replaces the hash without the given keys.
# hash = { a: true, b: false, c: nil}
# hash.except!(:c) # => { a: true, b: false}
# hash # => { a: true, b: false }
def except!(*keys)
keys.each { |key| delete(key) }
self
end
end
Oneliner平原红宝石,它只适用于红宝石> 1.9.x:
1.9.3p0 :002 > h = {:a => 1, :b => 2}
=> {:a=>1, :b=>2}
1.9.3p0 :003 > h.tap { |hs| hs.delete(:a) }
=> {:b=>2}
Tap方法总是返回被调用的对象...
否则,如果您需要active_support/core_ext/hash
(这在每个Rails应用程序中都会自动需要),您可以根据需要使用以下方法之一:
➜ ~ irb
1.9.3p125 :001 > require 'active_support/core_ext/hash' => true
1.9.3p125 :002 > h = {:a => 1, :b => 2, :c => 3}
=> {:a=>1, :b=>2, :c=>3}
1.9.3p125 :003 > h.except(:a)
=> {:b=>2, :c=>3}
1.9.3p125 :004 > h.slice(:a)
=> {:a=>1}
除了使用黑名单方法之外,它将删除列出的所有键作为参数,而切片使用白名单方法,因此它将删除未作为参数列出的所有键。 还有那些方法的爆炸版本( except!
和slice!
),它们修改给定的散列,但是它们的返回值不同,它们都返回一个散列。 它代表slice!
的删除键slice!
和except!
保留的密钥except!
:
1.9.3p125 :011 > {:a => 1, :b => 2, :c => 3}.except!(:a)
=> {:b=>2, :c=>3}
1.9.3p125 :012 > {:a => 1, :b => 2, :c => 3}.slice!(:a)
=> {:b=>2, :c=>3}
为什么不使用:
hash.delete(key)
链接地址: http://www.djcxy.com/p/60951.html
上一篇: How to remove a key from Hash and get the remaining hash in Ruby/Rails?