2013-03-17 92 views
0

我需要建立哈希數組,看起來像這樣:紅寶石重新結構化數據

[ 
{:name=>"company", :value=>"Microsoft"}, 
{:name=>"type", :value=>"software"}, 
{:name=>"country", :value=>"US"}, 
{:name=>"valid", :value=>"yes"} 
] 

而不是必須保持定義名稱和值字段我已經建立了一個輔助功能,看起來像這樣:

def build(attributes=[]) 
list = [] 
attributes.each {|k,v| list.push({:name=> "#{k}", :value=> "#{v}"})} 
list 
end 

然後我就可以簡單地創建我的數組是這樣的:

attribs = { :company => 'Microsoft', :type => 'software', :country=> 'US', :valid=> 'yes'} 
puts build(attribs).inspect 

#[{:name=>"company", :value=>"Microsoft"}, {:name=>"type", :value=>"software"}, {:name=>"country", :value=>"US"}, {:name=>"valid", :value=>"yes"}] 

這似乎豆蔻低效和詳細˚F或Ruby!有沒有更清潔或更有效的方法來達到這個結果?

問候,

Carlskii

+0

該結構看起來非常像對象狀態的表示 - 值是:name始終是相同的集合,還是您需要應對運行時變化? – 2013-03-17 11:33:48

+0

不幸的是,我將需要處理運行時變化! – user1513388 2013-03-17 11:35:13

回答

1

我認爲屬性有以下類型的數據:

attributes = [['company','Microsoft'],...] 

然後從生成哈希:

attributes.map { |k,v| {:name => k, :value => v} } 
#=> [{:name=>"company", :value=>"Microsoft"},... 
+0

完美! - 我認爲Ruby會提供一個更乾淨的方式來做到這一點。謝謝。 – user1513388 2013-03-17 11:43:20

0

您還可以使用Ruby的Hash.[]方法,它接受偶數個參數作爲k ey值對:

Hash['company', 'microsoft','type','software','country','us'] 
#=> {"company"=>"microsoft", "type"=>"software", "country"=>"us"} 

這通常與Ruby的splat運算符結合使用,它允許您傳遞數組作爲方法參數。

attributes = ['company', 'microsoft','type','software','country','us'] 
Hash[*attributes] 
#=> {"company"=>"microsoft", "type"=>"software", "country"=>"us"}