2013-12-22 14 views
0

我稱之爲「數據」陣列的陣列,其是: enter image description here(內置它來調整使用sb's advice on Active Admin迭代陣列的陣列以簡化代碼(紅寶石,導軌,有源管理員1.0)

我需要使用它的數據來創建散列的一個陣列具有這種結構:

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

,目標具有顯示陣列「日期」的第一部分:採集,品牌,資格。

數量在以顯示相關量陣列「數據」,如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?

+0

你能展示一個預期的輸出目標和數據是指什麼? – bjhaid

+0

@bjhaid只是加了一些解釋。這是非常基本的:我有一個數組與goal_type和每個goal_type一個數字。我需要使用名爲'data'的數組內部的信息來創建另一個名爲data_prepared_for_table的數組。我設法做到這一點,但正如我所說,如果可能的話,我想幹DRY /簡化/減少代碼感謝循環/迭代。我還需要提供的情況下,我不知道數組中的值的數量。 – Mathieu

回答

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) ] 

有一堆額外的噪音。

+0

的確我不需要intermdiary數組。只是直接使用.map!謝謝 – Mathieu