2013年1月22日火曜日

ruby(rails)で多次元Hashから指定したキーに合致する値を取得する


中の人です。

探したけどなかったから作りました。

#=scan
#多次元ハッシュのキーを配列で指定、先頭から順にハッシュを取得する
#配列が終わった時点で値を返す。
#該当するキーが無ければnil
#==params
#overwrap::false キーの途中でHash以外が返った場合はnilを返す。
#        ::true  キーの途中でHash以外が返った場合は値を返す。
module HashScan
def self.scan(hash_obj,keys=[],overwrap=false)
 if keys==[]
   hash_obj
 elsif !(hash_obj.instance_of? Hash)
   if overwrap
     hash_obj
   else
     nil
   end
 elsif hash_obj.key?(keys.first)
   key=keys.shift
   scan(hash_obj[key],keys,overwrap)
 else
   nil
 end
end
end
module HashScanInclude
  def scan(keys=[],overwrap=false)
    HashScan.scan(self,keys,overwrap)
  end
end
class Hash
  include HashScanInclude
end

h={"1"=>{:key=>{:key2=>{"2"=>'value'}}}}
h.scan(["1",:key,:key2])
=> {"2"=>"value"}
h.scan(["1",:key,:key2,"2","NONE"],true)
=> "value"
h.scan(["1",:key,:key2,"2","NONE"],false)
=> nil

0 件のコメント:

コメントを投稿