【发布时间】:2012-02-01 13:33:55
【问题描述】:
我将如何删除散列中的键数组?例如,您可以调用:
hash.delete(some_key)
但我该怎么做:
hash.delete([key1,key2,key3,...])
无需手动循环。
【问题讨论】:
-
如果你有一个数组,那么无论如何你都会遍历它。也许您不需要将这些键存储在数组中,而是立即删除它们。
我将如何删除散列中的键数组?例如,您可以调用:
hash.delete(some_key)
但我该怎么做:
hash.delete([key1,key2,key3,...])
无需手动循环。
【问题讨论】:
您可以遍历一组键并删除它们中的每个人:
[key1, key2, key3].each { |k| some_hash.delete k }
想不起更好的解决方案了。
【讨论】:
这正是您正在寻找的... 您可以这样做,而无需不必要地遍历数组。
keys_to_delete = [key1, key2, key3]
hash_array.except!(*keys_to_delete)
结果存储在hash_array中
【讨论】:
你可以尝试使用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 }
【讨论】:
也许值得做一个方法
class Hash
def delete_by_keys *keys
keys.each{|k| delete(k)}
end
end
hash_array.delete_by_keys(key1,key2,..)
【讨论】:
keys.map 而不是 keys.each 返回已删除的值数组。有用。
ActiveSupport(Rails 的一部分)完全实现了这一点,如 Hash#except 和 Hash#except!
def except!(*keys)
keys.each { |key| delete(key) }
self
end
【讨论】: