Удалить массив ключей в Ruby Hash - PullRequest
14 голосов
/ 01 февраля 2012

Как бы я удалил массив ключей в хэше?Например, вы можете позвонить:

hash_array.delete(some_key)

Но как я могу это сделать:

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

без необходимости перебирать массив.

Ответы [ 5 ]

15 голосов
/ 01 февраля 2012

Вы можете перебрать массив ключей и удалить каждый из них:

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

Не могу вспомнить лучшего решения.

12 голосов
/ 23 июля 2014

Это именно то, что вы ищете ... Вы можете сделать это так, без необходимости циклически перебирать массив.

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

Результат сохраняется в hash_array

11 голосов
/ 01 февраля 2012

Вы можете попробовать использовать Hash # delete_if :

delete_if удаляет каждую пару ключ-значение из hsh, для которой блок имеет значение true.

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

UPDATE Если вы не хотите перебирать массив ключей, вы можете использовать Установить вместо Array (поскольку Set использует Hash в качестве хранилища include? равно O (1)):

require 'set'
keys = [key1,key2,key3].to_set
array_hash.delete_if { |key, _| keys.include? key }
2 голосов
/ 01 февраля 2012

Может стоит сделать метод

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

hash_array.delete_by_keys(key1,key2,..)
0 голосов
/ 30 апреля 2014

ActiveSupport (часть Rails) реализует именно это, как Hash # кроме и Hash # кроме!

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

См. http://apidock.com/rails/v4.0.2/Hash/except%21

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...