迭代一个数组数组来简化代码(Ruby,Rails,active admin 1.0)

问题描述 投票:0回答:1

我有一个名为'data'的数组数组,它​​是:(构建它以调整使用sb's advice on Active Admin

我需要使用它的数据来创建一个具有这种结构的哈希数组:

data_prepared_for_table = [{goal: data[0][0], number: data[0][1]},
                    {goal: data[1][0], number: data[1][1]},
                    {goal: data[2][0], number: data[2][1]},
                    {goal: data[3][0], number: data[3][1]},
                    {goal: data[4][0], number: data[4][1]},
                    {goal: data[5][0], number: data[5][1]}
                   ]

在data_prepared_for_table中,目标必须显示数组'日期'的第一部分:获取,品牌,资格。

Number必须在数组'data'中显示相关数量,例如3,2,1。

我想做两件事:

  • 通过使用每个或为lop来简化/改进代码,这将使我能够生成data_prepared_for_table,如: data_prepared_for_table = [(0..5).each do |i| {goal: data[i][0], number: data[i][1]}, ] 但它不起作用并产生错误。我该怎么办?
  • 另一件事是,在我给它的例子中,它上升到数据[5] [0],但我希望能够不指定结束(这里是5),以防数组变长并上升到数据[6]或甚至更多[7],等等...我实际上事先不知道它会得到多久!

如果不指定i的最后一个值,我怎么能这样做?也许在迭代中,指定i必须递增直到data[i][0].exists?

ruby-on-rails ruby arrays ruby-on-rails-3 activeadmin
1个回答
1
投票

你只需要在混合中抛出一点map来将你的数组映射到你想要的格式:

array_of_hashes = array_of_arrays.map { |a| { :goal => a.first, :number => a.last.to_i } }

您可能会或可能不想要to_i电话,但考虑到您的任务历史,它可能是有意义的。

您还可以将其与原始查询的位置结合使用:

array_of_hashes = Deal.connection.select_rows(...).map do |row|
  { :goal => row.first, :number => row.last.to_i }
end

避免中间数组(当然假设您不需要任何数组的数组)。


这个问题:

data_prepared_for_table = [(0..5).each do |i|
                {goal: data[i][0], number: data[i][2]},                        
               ]

是你在each区块内有一个迷路逗号,你正在看data[i][2]而不是data[i][1],最重要的是,each返回其接收器,所以你真的写这个:

data_prepared_for_table = [ (0..5) ]

带着一堆额外的噪音。

© www.soinside.com 2019 - 2024. All rights reserved.