1. ホーム
  2. ruby

[解決済み] ハッシュからサブハッシュを取り出すには?

2022-12-03 05:43:12

質問

ハッシュがあります。

h1 = {:a => :A, :b => :B, :c => :C, :d => :D}

このようなサブハッシュを抽出するのに最適な方法は何でしょうか?

h1.extract_subhash(:b, :d, :e, :f) # => {:b => :B, :d => :D}
h1 #=> {:a => :A, :c => :C}

どのように解決するのですか?

具体的には、抽出された要素を返すが、h1はそのままで良いという場合です。

h1 = {:a => :A, :b => :B, :c => :C, :d => :D}
h2 = h1.select {|key, value| [:b, :d, :e, :f].include?(key) } # => {:b=>:B, :d=>:D} 
h1 = Hash[h1.to_a - h2.to_a] # => {:a=>:A, :c=>:C} 

そして、それをHashクラスにパッチする場合。

class Hash
  def extract_subhash(*extract)
    h2 = self.select{|key, value| extract.include?(key) }
    self.delete_if {|key, value| extract.include?(key) }
    h2
  end
end

指定した要素をハッシュから削除したいだけなら、もっと簡単に delete_if .

h1 = {:a => :A, :b => :B, :c => :C, :d => :D}
h1.delete_if {|key, value| [:b, :d, :e, :f].include?(key) } # => {:a=>:A, :c=>:C} 
h1  # => {:a=>:A, :c=>:C}