2013-01-16 54 views
-1

Argh。试图解决如何在Ruby中构建数组时遇到问题。Ruby建立阵列

所以我循环遍历一个结果,我想添加类别字段作为键,并让它如此,如果下一行具有相同的类别它会被放入该类别。如果没有,它会创建一个新数组并将其添加到该数组中。

这是我到目前为止。

data = Array.new 
results.each do |row| 
    data[row.category].push row.field 
end 

这是不会工作我知道。我想要data[row.category]最终(在循环后)包含所有的row.field

所以我最终得到一个看起来像这样的数组。

[['Dogs', 5, 12, 2], ['Cats', 4, 5, 9], ['Fish', 25, 82, 23]] 

所以不管有多少循环做的,如果我推到已经存在于数据的数组,然后它只是追加它,如果数组不存在,创建它,然后追加它。

在PHP中,我只想做到这一点:

$data[$row['category']][] = $row['field'] 

随着空[]表示创建一个新的数组,如果是没有的。我如何在Ruby中做到这一点?

回答

2

呀,你似乎是由PHP及其关联数组(未在任何其他语言:)称为数组)相混淆:如果您将其更改为

您的代码应该工作。你需要一个散列。试试这个片段:

data = results.each_with_object({}) do |row, memo| 
    memo[row.category] ||= [] # create array unless it exists 
    memo[row.category] << row.field 
end 
+0

嗨感谢您的快速回复,但结果如下:'{“category”=>“Sales”,“field”=> 5502.0}'我得到这个错误代码示例:'undefined method'category'for#哈希:0x007f84fb44e5d0>“有什么想法? –

+0

@SolidPink:是的,只需使用'row ['category']'而不是'row.category'。 –

+0

宾果!感谢那。那么为什么行['']而不是行。 ? –

0

与PHP不同,您不能使用任何对象作为Array的索引。在Ruby中,我们使用Hash es将任意对象与其他对象关联。

data = Hash.new { |hash, key| hash[key] = [] } 

results.each do |row| 
    data[row.category] << row.field 
end 
+1

不,这不会覆盖新数组的创建。 –

+0

@SergioTulentsev,它现在应该,谢谢。 –

+1

你测试过这个版本的代码吗?我感觉它仍然无法工作。 –