1

私は次のものを持っています

friends = [{ name: "Jack", attr1:"def", attr2:"def" }, { name: "Jill", attr1:"def", attr2:"def" }]

上記の表現をこのようなハッシュのハッシュに変換したい

friends = { "Jack" => { attr1: "def", attr2:"def" }, "Jill" => { attr1: "def", attr2: "def" } }

Ruby でこれを行うエレガントな方法はありますか?

4

5 に答える 5

6
Hash[friends.map { |f| _f = f.dup; [_f.delete(:name), _f] }]
# => {"Jack"=>{:attr1=>"def", :attr2=>"def"}, "Jill"=>{:attr1=>"def", :attr2=>"def"}}
于 2012-06-27T15:42:16.990 に答える
3
friends.each_with_object({}) do |f, o|
    f = f.dup
    o[f.delete :name] = f
end
于 2012-06-27T15:44:08.650 に答える
2
hash = {}
friends.each{|h| hash[h.delete(:name)] = h }
# => {"Jack"=>{:attr1=>"def", :attr2=>"def"}, "Jill"=>{:attr1=>"def", :attr2=>"def"}}
于 2012-06-27T15:45:53.023 に答える
1

再利用可能な抽象化を活用して簡潔なコードを記述する方法として「エレガント」を理解するなら、次のように記述します。

require 'active_support/core_ext/hash'
require 'facets/hash'
friends.mash { |f| [f[:name], f.except(:name)] }

これら 2 つのかなり大きなライブラリに gem の依存関係を追加する必要はありません。拡張ライブラリに個々のメソッドをいつでも実装できます。

于 2012-06-27T16:26:28.917 に答える
1

ある配列を別の配列に変換する場合は、次を使用しますcollect

friends = Hash[
  friends.collect do |f|
    _f = f.dup
    name = _f.delete(:name)
    [ name, _f ]
  end
]

を使用して新しいハッシュを簡単に作成Hash[]し、一連のキーと値のペアを含む配列を提供できます。この場合、nameフィールドはそれぞれから削除されます。

于 2012-06-27T15:43:50.050 に答える