哈希删除除特定键以外的所有键

gla*_*kou 71 ruby ruby-on-rails ruby-on-rails-3

除了给定的密钥之外,我想从哈希中删除每个密钥.

例如:

{
 "firstName": "John",
 "lastName": "Smith",
 "age": 25,
 "address":
 {
     "streetAddress": "21 2nd Street",
     "city": "New York",
     "state": "NY",
     "postalCode": "10021"
 },
 "phoneNumber":
 [
     {
       "type": "home",
       "number": "212 555-1234"
     },
     {
       "type": "fax",
       "number": "646 555-4567"
     }
 ]
}
Run Code Online (Sandbox Code Playgroud)

我想删除除"firstName"和/或"address"之外的所有内容

谢谢

Mar*_*her 250

怎么样slice

hash.slice('firstName', 'lastName')
 # => { 'firstName' => 'John', 'lastName' => 'Smith' }
Run Code Online (Sandbox Code Playgroud)

  • 问题没有特别提到Rails,但它被标记为这样.这是使用Rails或core_ext时的最佳选择. (9认同)
  • [Hash#slice](https://ruby-doc.org/core-2.5.1/Hash.html#method-i-slice) 现在是纯 Ruby,不需要 Rails。 (5认同)
  • 是的,这就是我建议`slice`的原因. (3认同)

Jak*_*sey 47

其他一些选择:

h.select {|k,v| ["age", "address"].include?(k) }
Run Code Online (Sandbox Code Playgroud)

或者你可以这样做:

class Hash
  def select_keys(*args)
    select {|k,v| args.include?(k) }
  end
end
Run Code Online (Sandbox Code Playgroud)

所以你现在可以说:

h.select_keys("age", "address")
Run Code Online (Sandbox Code Playgroud)


asi*_*niy 8

如果您使用Rails,请考虑ActiveSupportexcept()方法:http://apidock.com/rails/Hash/ except

hash = { a: true, b: false, c: nil}
hash.except!(:c) # => { a: true, b: false}
hash # => { a: true, b: false }
Run Code Online (Sandbox Code Playgroud)

  • except 保留除给定之外的所有内容。与问题的内容相反。 (24认同)

Jim*_*lle 6

哈希#select做你想要的:

   h = { "a" => 100, "b" => 200, "c" => 300 }
   h.select {|k,v| k > "a"}  #=> {"b" => 200, "c" => 300}
   h.select {|k,v| v < 200}  #=> {"a" => 100}
Run Code Online (Sandbox Code Playgroud)

编辑(评论):

假设h是上面的哈希:

h.select {|k,v| k == "age" || k == "address" }
Run Code Online (Sandbox Code Playgroud)


ar3*_*1an 5

hash = { a: true, b: false, c: nil }
hash.extract!(:c) # => { c: nil }
hash # => { a: true, b: false }
Run Code Online (Sandbox Code Playgroud)