红宝石:通过哈希
问题描述:
数组生成散列的哈希
我有以下红宝石:通过哈希
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中这样做?
答
Hash[friends.map { |f| _f = f.dup; [_f.delete(:name), _f] }]
# => {"Jack"=>{:attr1=>"def", :attr2=>"def"}, "Jill"=>{:attr1=>"def", :attr2=>"def"}}
答
当你想一个数组转换为另一种,用collect
:
friends = Hash[
friends.collect do |f|
_f = f.dup
name = _f.delete(:name)
[ name, _f ]
end
]
您可以创建一个新的哈希容易使用Hash[]
,并为其提供了一系列的键/值对数组它。在这种情况下,name
字段将从每个字段中删除。
答
friends.each_with_object({}) do |f, o|
f = f.dup
o[f.delete :name] = f
end
答
hash = {}
friends.each{|h| hash[h.delete(:name)] = h }
# => {"Jack"=>{:attr1=>"def", :attr2=>"def"}, "Jill"=>{:attr1=>"def", :attr2=>"def"}}
答
如果我们理解“优雅”来写通过利用可重用的抽象简洁的代码的方式,我会写:
require 'active_support/core_ext/hash'
require 'facets/hash'
friends.mash { |f| [f[:name], f.except(:name)] }
无需添加gem依赖这两个相当大型图书馆,你可以随时在你的扩展库中实现个别方法。
你还需要从属性中删除名称:-) – tokland
@tokland要解决这个问题,你可以把它改成'Hash [friends.map {| f | [f.delete(:name),f]}]' – William
Thanks @William - 我用你的修复更新了答案。 –