2012-02-01 33 views
14

ハッシュで配列のキーを削除するにはどうすればいいですか?たとえば、あなたが呼び出すことができます。Rubyハッシュでキーの配列を削除

hash_array.delete(some_key) 

しかし、どのように私はこれを行うことができます。必要以上に配列をループせずに

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

を。

+0

に格納されます。おそらく、これらのキーを配列に格納する必要はありませんが、すぐに削除してください。 – megas

答えて

14

あなたはキーの配列を反復処理し、それらのすべての人を削除することができます。

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

は、任意のより良い解決策を思い出すことができません。

+0

私はループから離れようとしています。なぜなら、それらは遅く、このコードは時間に敏感だからです。 –

+1

私は見ていますが、キーの配列を扱う場合は、とにかくそれを反復処理する必要があります。あなたのケースでハッシュと配列のサイズは何ですか? –

+0

私は本当に、キーの配列を反復処理する必要はありません、ちょうどハッシュのそれらのキーを削除する必要があります。ハッシュには約20,000個のアイテムがありますが、毎回異なるアイテムで複数回ループする必要があります。 –

2

多分それはあなたがHash#delete_ifを使用しようとすることができます方法

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

hash_array.delete_by_keys(key1,key2,..) 
+0

役に立つことがあります。ありがとうございました。 –

+1

'' 'keys.map'''の代わりに' 'keys.each'''は削除された値の配列を返します。有用。 – kuboon

10

をする価値がある:

delete_ifはブロックがtrueと評価されるHSHからすべてのキーと値のペアを削除します。

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

あなたはキーの配列を反復処理したくない場合は、あなたがArrayの代わりにSetを使用することができます UPDATE(ストレージinclude?としてHash使用Set以来はO(1)) :

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

+1。私はちょうどこれを追加しようとしていた。もちろん、アイテムを繰り返し処理します(数回でも)。 –

+0

ハッシュのサイズが配列のサイズよりも大きければ、この方法は配列を反復するよりも効率的ではありません。 –

+1

@ KL-7が同意すると、いくつかのコードを最適化する前にペパフォーマンスベンチマークを行う必要があり、測定を行わない最適化は実行時間とメモリ消費を増加させる可能性があります。このようなコードを最適化するのは面倒ではありません。 OPにはいくつかの選択肢があります:) –

0

ActiveSupport(Railsの一部)は、これをHash#exceptと同様に実装しています。ハッシュ#を除く!

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

は、あなたが "スプラット演算子"(*)をどうするつもり何を達成することができますhttp://apidock.com/rails/v4.0.2/Hash/except%21

1

を参照してください。

hash_array.delete *[key1,key2,key3,...] 

これは、すべてのキーを別々の引数として渡すのと同じです。

+3

はきれいに見えますが、うまく動作しません。 –

+1

は私にとってはあまり役に立ちません – traHfo

8

これはまさにあなたが探しているものです... これは、不必要にアレイをループすることなく、このようにすることができます。

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

結果は、あなたは、配列を持っているなら、あなたはどのような場合には、それを反復よhash_array

+5

これはレールの一部であり、ルビーではありません。 – sokkyoku

関連する問題