1

検索パフォーマンスを向上させるためにハッシュの配列を変更したい

私は持っています:

a = [ {"id" => 1, "name" => "Matt", "email" => "matt@example.com"}, {"id" => 2, "name" => "Charlie", "email" => "charlie@example.com"} ]

これを次のように変換したいと思います。

b = [ {1 => { "name" => "Matt", "email" => "matt@example.com"}},{2 => { "name" => "Charlie", "email" => "charlie@example.com"}} ]

「id」フィールドは必ずしも順次または連続したセットである必要はありませんが、各オカレンスは一意であることに注意してください。また、bの値としてネストされたハッシュには、作業が簡単になる場合は「id」キーと値のペアを含めることができます。

4

3 に答える 3

2

試す:

a.map{|record| the_id = record.delete("id"); {the_id => record}}
于 2012-11-28T00:52:56.240 に答える
2

説明する配列を取得するには、次のようにします。

b = a.map {|i| { i["id"] => i } }

ただし、これを実行して効率的な検索を実行する場合idは、配列の代わりにハッシュを作成することに注意してください。

b = a.inject({}) {|h,i| h[i["id"]]=i; h}
于 2012-11-28T00:50:49.827 に答える
1
a.each_with_object({}) { |x, h| h[x.delete('id')] = x }

これにより、新しいハッシュ()が作成され、各要素と{}同様にブロックに渡されます。ブロック内でキー/値をから削除し、それを返すので、結果のハッシュに値を割り当てるためのインデックスとして使用できます。hxx.delete('id')idxh

kmkaplanのコメントごとに編集:元の配列がまだ必要な場合は、次を使用してください。

a.each_with_object({}) { |x, h| c = x.clone; h[c.delete('id')] = c }

kmkaplanの他のコメントごとに編集:OPが本当に混乱していない場合、ネイトマレーの答えは正しいものです。

于 2012-11-28T00:45:17.450 に答える