配列 - ruby ハッシュ 値 取得




ハッシュ値を変更するには? (8)

Rubyにはtapメソッド( 1.8.7 )があり、このようなものには非常に便利です。

original_hash = { :a => 'a', :b => 'b' }
original_hash.clone.tap{ |h| h.each{ |k,v| h[k] = v.upcase } }
# => {:a=>"A", :b=>"B"}
original_hash # => {:a=>"a", :b=>"b"}

私はvalue.some_methodハッシュの各valueを置き換えたいとvalue.some_methodます。

たとえば、与えられた単純なハッシュの場合:

{"a" => "b", "c" => "d"}` 

すべての値は.upcase dでなければならないので、次のようになります。

{"a" => "B", "c" => "D"}

#collect#mapを試し#collectが、常に配列を取得するだけです。 これを行うエレガントな方法はありますか?

更新

ちょっと、忘れてしまった:ハッシュは変更すべきではないインスタンス変数にあります。 変更された値で新しいハッシュが必要ですが、その変数を明示的に定義しないで、ハッシュを埋めてループします。 何かのようなもの:

new_hash = hash.magic{ ... }

ActiveSupport v4.2.0にはそのための方法があります。 これはtransform_valuesと呼ばれ、基本的に各キーと値のペアごとにブロックを実行します。

彼らはeachを使ってやっているので、ループするよりも良い方法はないと思う。

hash = {sample: 'gach'}

result = {}
hash.each do |key, value|
  result[key] = do_stuff(value)
end

Rails固有の

誰かがそれぞれの値に対してto_sメソッドを呼び出す必要があり、Rails 4.2( transform_valuesメソッドのlinkを含む)を使用していない場合は、以下のことができます:

original_hash = { :a => 'a', :b => BigDecimal('23.4') }
#=> {:a=>"a", :b=>#<BigDecimal:5c03a00,'0.234E2',18(18)>}
JSON(original_hash.to_json)
#=> {"a"=>"a", "b"=>"23.4"}

注意: 'json'ライブラリの使用が必要です。

注2:キーを文字列に変換します


この関数を試してください:

h = {"a" => "b", "c" => "d"}
h.each{|i,j| j.upcase!} # now contains {"a" => "B", "c" => "D"}.

さらに進んで、ネストされたハッシュでこれを行うことができます。 確かに、これはRailsプロジェクトでかなりの量が発生します。

paramsハッシュがUTF-8であることを確認するコードは次のとおりです。

  def convert_hash hash
    hash.inject({}) do |h,(k,v)|
      if v.kind_of? String
        h[k] = to_utf8(v) 
      else
        h[k] = convert_hash(v)
      end
      h
    end      
  end    

  # Iconv UTF-8 helper
  # Converts strings into valid UTF-8
  #
  # @param [String] untrusted_string the string to convert to UTF-8
  # @return [String] your string in UTF-8
  def to_utf8 untrusted_string=""
    ic = Iconv.new('UTF-8//IGNORE', 'UTF-8')
    ic.iconv(untrusted_string + ' ')[0..-2]
  end  

値が文字列であることがわかっている場合は、サイクル中にreplaceメソッドを呼び出すことができます。この方法で値を変更します。

Altohughこれは、値が文字列であるため、質問に完全には答えない場合に限られています。誰かにとって有用であると思っていました。


私はこのような何かをする:

new_hash =ハッシュ[* original_hash.collect {| key、value | [key、value + 1]}。flatten]

これは、任意の式を介してキーや値を変換する機能を提供します(もちろん、非破壊的です)。


my_hash.each { |k, v| my_hash[k] = v.upcase } 

または、非破壊で行いたい場合は、 my_hashを変更する代わりに新しいハッシュを返しmy_hash

a_new_hash = my_hash.inject({}) { |h, (k, v)| h[k] = v.upcase; h } 

この最後のバージョンには、鍵を変換できるという利点もあります。





hash