Ответ 1
Вы можете перебирать массив ключей и удалять все из них:
[key1, key2, key3].each { |k| some_hash.delete k }
Невозможно вспомнить лучшее решение.
Как я могу удалить массив ключей в хеше? Например, вы можете позвонить:
hash_array.delete(some_key)
Но как я могу это сделать:
hash_array.delete([key1,key2,key3,...])
без излишнего чередования массива.
Вы можете перебирать массив ключей и удалять все из них:
[key1, key2, key3].each { |k| some_hash.delete k }
Невозможно вспомнить лучшее решение.
Вы можете попытаться использовать Hash # delete_if:
delete_if удаляет каждую пару ключ-значение из hsh, для которого блок оценивает значение true.
array_hash.delete_if { |key, _| [key1, key2, key3].include? key }
UPDATE
Если вы не хотите перебирать массив ключей, вы можете использовать Set вместо Array
(так как Set
использует Hash
как хранилище include?
равно O (1)):
require 'set'
keys = [key1,key2,key3].to_set
array_hash.delete_if { |key, _| keys.include? key }
Это именно то, что вы ищете... Вы можете сделать это так, не зацикливая массив без необходимости.
keys_to_delete = [key1, key2, key3]
hash_array.except!(*keys_to_delete)
Результат сохраняется в hash_array
Возможно, стоит сделать метод
class Hash
def delete_by_keys *keys
keys.each{|k| delete(k)}
end
end
hash_array.delete_by_keys(key1,key2,..)
Вы можете достичь того, что собираетесь использовать с "оператором splat" (*
).
hash_array.delete *[key1,key2,key3,...]
Это эквивалентно передаче каждого ключа в качестве отдельного аргумента.
ActiveSupport (часть Rails) реализует именно это, как Hash # except и Hash # except!
def except!(*keys)
keys.each { |key| delete(key) }
self
end