【问题标题】:Ruby Building an ArrayRuby 构建一个数组
【发布时间】:2013-01-16 05:53:51
【问题描述】:

啊。在这里尝试弄清楚如何在 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 中做到这一点???

【问题讨论】:

    标签: ruby arrays multidimensional-array


    【解决方案1】:

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

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

    【讨论】:

    • 您好,感谢您的快速回复,但结果如下:{"category"=&gt;"Sales", "field"=&gt;5502.0} 我在代码示例中收到此错误:undefined method 'category' for #&lt;Hash:0x007f84fb44e5d0&gt; 有什么想法吗?
    • @SolidPink:是的,只需使用row['category'] 而不是row.category
    • 宾果游戏!感谢那。那么为什么行 [''] 而不是行。 ?
    • 因为,与 PHP 不同,ruby 不会在幕后做奇怪的笨蛋。哈希是一种简单的结构。它没有category 方法。但它确实有一个[] 方法,可以通过它的键为你获取一个值。 :)
    • 另外,很快。如何开始具有一定长度的新哈希。例如,对于上面的代码,可能有一些 data[row.category] 有 2 个条目,一些有 3 个条目。(或者其他什么,关键是它不会是一个漂亮、整洁的散列)。我可以垫出来吗?也许说不知何故缺失值为零?
    【解决方案2】:

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

    如果您将代码更改为:

    data = Hash.new { |hash, key| hash[key] = [] }
    
    results.each do |row|
       data[row.category] << row.field
    end
    

    【讨论】:

    • 不,这不包括新数组的创建。
    • 你测试过这个版本的代码吗?我感觉它仍然行不通。
    • results 是您希望循环的任何内容。可能是一个对象。就我而言,它是数据库查询的结果。
    猜你喜欢
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    相关资源
    最近更新 更多