2012-06-27 267 views
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中這樣做?

回答

6
Hash[friends.map { |f| _f = f.dup; [_f.delete(:name), _f] }] 
# => {"Jack"=>{:attr1=>"def", :attr2=>"def"}, "Jill"=>{:attr1=>"def", :attr2=>"def"}} 
+1

你還需要從屬性中刪除名稱:-) – tokland

+1

@tokland要解決這個問題,你可以把它改成'Hash [friends.map {| f | [f.delete(:name),f]}]' – William

+0

Thanks @William - 我用你的修復更新了答案。 –

1

當你想一個數組轉換爲另一種,用collect

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

您可以創建一個新的哈希容易使用Hash[],併爲其提供了一系列的鍵/值對數組它。在這種情況下,name字段將從每個字段中刪除。

3
friends.each_with_object({}) do |f, o| 
    f = f.dup 
    o[f.delete :name] = f 
end 
2
hash = {} 
friends.each{|h| hash[h.delete(:name)] = h } 
# => {"Jack"=>{:attr1=>"def", :attr2=>"def"}, "Jill"=>{:attr1=>"def", :attr2=>"def"}} 
1

如果我們理解「優雅」來寫通過利用可重用的抽象簡潔的代碼的方式,我會寫:

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

無需添加gem依賴這兩個相當大型圖書館,你可以隨時在你的擴展庫中實現個別方法。