2017-06-25 7 views
2

私は、オブジェクトの配列をハッシュの配列に変換することに成功しました。しかし、結合されたハッシュを得る前に、オブジェクトをわずかに変更したいと思っています。 変更された値を持つハッシュの配列を返す方法

この

は私が組み合わされたハッシュにオブジェクトの配列を変換するために何をすべきかです:

prev_vars.map(&:to_h).reduce({}, :merge) 
{ "b"=>#<Money fractional:400 currency:GBP> } 

しかし、私は、さらにto_iを呼び出すために必要なこれは、代わりに持つようにしたいです:

{ "b"=> 4 } 

Iこのラインを使ってこれを使っていますが、より洗練されたソリューションを探しています:

prev_vars.map(&:to_h).reduce({}) { |combined, v| combined.merge({v.keys[0] => v.values[0].to_i}) } 

答えて

3

prev_varsの額はどれくらいですか? map(&:to_h)は、まったく新しい配列をインスタンス化するので、かなりの量のメモリオーバーヘッドを必要とする可能性があります。代わりに、私は順序を切り替えるお勧めします:最初#reduce、その後、#to_h

prev_vars.reduce({}) do |combined, var| 
    combined.merge! var.to_h.transform_values!(&:to_i) 
end 

#merge!ではなく#mergeの使用新しいハッシュは、ループの各反復のためcombinedのために作成されないように。

関連する問題