我有以下
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中执行此操作的任何优雅方式?
答案 0 :(得分:6)
Hash[friends.map { |f| _f = f.dup; [_f.delete(:name), _f] }]
# => {"Jack"=>{:attr1=>"def", :attr2=>"def"}, "Jill"=>{:attr1=>"def", :attr2=>"def"}}
答案 1 :(得分:3)
friends.each_with_object({}) do |f, o|
f = f.dup
o[f.delete :name] = f
end
答案 2 :(得分:2)
hash = {}
friends.each{|h| hash[h.delete(:name)] = h }
# => {"Jack"=>{:attr1=>"def", :attr2=>"def"}, "Jill"=>{:attr1=>"def", :attr2=>"def"}}
答案 3 :(得分:1)
如果要将一个数组转换为另一个数组,请使用collect
:
friends = Hash[
friends.collect do |f|
_f = f.dup
name = _f.delete(:name)
[ name, _f ]
end
]
您可以使用Hash[]
轻松创建新哈希,并为其提供一系列键/值对。在这种情况下,name
字段将从每个字段中删除。
答案 4 :(得分:1)
如果我们通过利用可重用的抽象来理解“优雅”作为编写简洁代码的方法,我会写道:
require 'active_support/core_ext/hash'
require 'facets/hash'
friends.mash { |f| [f[:name], f.except(:name)] }
无需为这两个相当大的库添加gem依赖项,您可以随时在扩展库中实现各个方法。