8

ネストされたドキュメントを含む特定のハッシュ:

myHash = {
  "MemberId"=>"ABC0001", 
  "MemberName"=>"Alan", 
  "details"=>[
    {"LineNumber"=>"4.1", "Item"=>"A0001", "Description"=>"Apple"}, 
    {"LineNumber"=>"5.1", "Item"=>"A0002"}, 
    {"LineNumber"=>"6.1", "Item"=>"Orange"}
  ]
}

次のように変更したいと思います。

{
  "memberid"=>"ABC0001", 
  "membername"=>"Alan", 
  "details"=>[
    {"linenumber"=>"4.1", "item"=>"A0001", "description"=>"Apple"}, 
    {"linenumber"=>"5.1", "item"=>"A0002"}, 
    {"linenumber"=>"6.1", "item"=>"Orange"}
  ]
}

つまり、ハッシュキーにある場合は小文字に変更したいのです。ハッシュを反復処理し、小文字の方法を使用する必要があることを理解しています。Rubyでこれを行う簡単な方法はありますか?

4

6 に答える 6

12

あなたは簡単に行うことができます

hash.transform_keys(&:downcase)

ハッシュキーを小文字に変更します。

私の答えを参照できますhttps://stackoverflow.com/a/54090178/8247133

于 2019-01-08T10:50:22.980 に答える
5
class Hash
  def downcase_key
    keys.each do |k|
      store(k.downcase, Array === (v = delete(k)) ? v.map(&:downcase_key) : v)
    end
    self
  end
end

myHash.downcase_key
于 2013-06-08T12:48:26.767 に答える
3
def f h
  Hash[h.map{|k,v| v.class == Array ? [k,v.map{|r| f r}.to_a] : [k.downcase,v]}]
end

証拠

于 2013-06-08T12:53:37.320 に答える
1

今日、同じ問題に取り組んでいるときに、この解決策を見つけました。

def lowercase_keys(h)
  new_h = { }
  h.each_pair do |k, v|
    new_k = deep_lowercase(k, true)
    new_v = deep_lowercase(v, false)
    new_h[new_k] = new_v
  end
  new_h
end

def deep_lowercase(object, with_strings)
  case object
    when String then
      with_strings ? object.downcase : object
    when Hash then
      lowercase_keys(object)
    else
      object.respond_to?(:map) ? object.map { |e| deep_lowercase(e, false) } : object
  end
end

私のテストから、ハッシュが値またはキー自体であるか、列挙型に埋め込まれているかに関係なく機能します。

于 2014-09-23T21:52:44.310 に答える