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"}]

这对于 Ruby 来说似乎有点低效和冗长!是否有更清洁或更有效的方法来实现此结果?

问候,

卡尔斯基

4

2 回答 2

1

我假设属性有这些数据:

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

然后从中构建哈希:

attributes.map { |k,v| {:name => k, :value => v} }
#=> [{:name=>"company", :value=>"Microsoft"},...
于 2013-03-17T11:35:24.733 回答
0

您还可以使用 Ruby 的Hash.[]方法,该方法接受偶数个参数作为键值对:

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"}
于 2013-03-17T12:36:27.227 回答