Ruby构建一个数组

时间:2013-01-16 05:53:52

标签: ruby arrays multidimensional-array

哎呀。在这里试图找出如何在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 个答案:

答案 0 :(得分:2)

是的,您似乎对PHP及其关联数组(在任何其他语言中都不称为数组:)感到困惑。)。你需要一个哈希。试试这个片段:

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

答案 1 :(得分:0)

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

如果您将代码更改为:

,则代码应该有效
data = Hash.new { |hash, key| hash[key] = [] }

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