删除Ruby Hash中的键数组

时间:2012-02-01 13:33:56

标签: ruby arrays hash

如何删除散列中的键数组?例如,您可以致电:

hash_array.delete(some_key)

但我怎么能这样做:

hash_array.delete([key1,key2,key3,...])

不必要地循环遍历数组。

5 个答案:

答案 0 :(得分:14)

您可以迭代一组键并删除其中的每个键:

[key1, key2, key3].each { |k| some_hash.delete k }

无法记住任何更好的解决方案。

答案 1 :(得分:12)

这正是你要找的...... 你可以这样做,而不必不必要地遍历数组。

keys_to_delete = [key1, key2, key3]
hash_array.except!(*keys_to_delete)

结果存储在hash_array

答案 2 :(得分:11)

您可以尝试使用Hash#delete_if

  

delete_if删除hsh中的每个键值对,其中块的计算结果为true。

array_hash.delete_if { |key, _| [key1, key2, key3].include? key }

<强>更新 如果您不想迭代一组键,则可以使用Set而不是Array(因为Set使用Hash,因为存储include?是O (1)):

require 'set'
keys = [key1,key2,key3].to_set
array_hash.delete_if { |key, _| keys.include? key }

答案 3 :(得分:2)

也许制作方法值得

class Hash
  def delete_by_keys *keys
    keys.each{|k| delete(k)}
  end
end

hash_array.delete_by_keys(key1,key2,..)

答案 4 :(得分:0)

ActiveSupport(Rails的一部分)实现了这个,就像Hash#除了和Hash#之外的那样!

def except!(*keys)
    keys.each { |key| delete(key) }
    self
end

请参阅http://apidock.com/rails/v4.0.2/Hash/except%21