APIコールへの応答としてオブジェクトを表すハッシュの配列があります。いくつかのハッシュからデータを取り出す必要があり、ある特定のキーがハッシュオブジェクトのIDとして機能します。私はIDとしてキーを持つハッシュとそのIDを持つ元のハッシュとしての値に配列を変換したいと思います。ハッシュの配列をハッシュの属性にインデックスされたハッシュハッシュに変換します。
api_response = [
{ :id => 1, :foo => 'bar' },
{ :id => 2, :foo => 'another bar' },
# ..
]
ideal_response = {
1 => { :id => 1, :foo => 'bar' },
2 => { :id => 2, :foo => 'another bar' },
# ..
}
が、私はこれをやって考えることができ、2つの方法があります
は、ここで私が話してんですよ。
- は、私がアクセスする必要のあるレコードごとに使用
api_response.find { |x| x[:id] == i }
- (下)
ideal_response
にデータをマップします。 - 私が気付いていない方法は、おそらく
map
を使ってハッシュを構築する方法です。マッピングの
私の方法:
keys = data.map { |x| x[:id] }
mapped = Hash[*keys.zip(data).flatten]
私は助けるが、これをするよりパフォーマンス、整然と方法があるように感じることができません。オプション2は、アクセスする必要があるレコードの数が非常に少ない場合に非常に効率的です。ここではマッピングが優れていますが、レスポンスには多くのレコードがある場合には分断され始めます。ありがたいことに、50-100以上のレコードがあるとは思わないので、マッピングで十分です。
Rubyでこれを行うには、よりスマートで、より洗練された、より効果的な方法がありますか?以下のような
これはパフォーマンスと整頓の点で私が持っていたマッピングより優れていますが、 'data [id] [0]'や 'data [id] .first'を介してレコードにアクセスするのはやや面倒です。私はこの時点でニックピッキングしています。他の誰かがリングに帽子を投げ捨てるかどうか見てみましょう。 – coreyward
これは、重複したキーを実行する可能性があるためです。 'group_by'は未知のデータで安全のために設計された汎用ルーチンです。重複や重大なコリジョンやデータの損失に遭遇することは決してないなど、アプリケーション固有の知識を持つことで、データ構造を1レベル単純化できます。 –