2017-01-30 44 views
-2

我想將一個數組的數組變成一個散列數組。有人可以試圖解釋我在這裏做錯了什麼嗎?數組數組中的第一個數組成爲哈希的鍵。我可以讓方法返回一個散列或甚至三個相同的散列。但是我不能在最終數組中返回每個不同的新散列。使用zip無法弄清散列紅寶石陣列

table_data = [ 
    ["first_name", "last_name", "city", "state"], 
    ["Elisabeth", "Gardenar", "Toledo", "OH"], 
    ["Jamaal", "Du", "Sylvania", "OH"], 
    ["Kathlyn", "Lavoie", "Maumee", "OH"] 
] 


def convert_table(table_array) 
    hash = {} 
    final_array = [] 
    headers_array = table_array.shift 

    table_array.each_index do |x| 
    i = 0 
    until i == headers_array.length 
     hash[headers_array[i]] = table_array[x][i] 
     final_array << hash 
     i += 1 
    end 
    end 
    final_array 
end 

p convert_table(table_data) 

#END GOAL 
[ { "first_name" => "Elisabeth", "last_name" => "Gardenar", "city" => "Toledo", "state" => "OH" }, 
{ "first_name" => "Jamaal", "last_name" => "Du", "city" => "Sylvania", "state" => "OH" }, 
{ "first_name" => "Kathlyn", "last_name" => "Lavoie", "city" => "Maumee", "state" => "OH" } 
+1

如果你說英語,請閱讀下面的評論,您已成功忽略永遠:\t ***我注意到你絕不接受回答你的問題。請務必回顧一下您的問題,並在他們解決您的問題時接受最佳答案。通過這種方式,您可以讓社區知道問題已經解決,同時您還獎勵提供解決方案的人的努力。要接受答案,請在答案分數下查找複選標記。*** –

+0

沒有提供MCVE,沒有提出任何問題。 Downvoted。 – mudasobwa

+0

我會說英語。我不熟悉這個網站的工作原理。現在我很熟悉,正在審閱我的問題並選擇正確的答案。我看到這樣做的價值和必要性。沒有必要嘗試和侮辱。如果你想對語法挑剔一些,我會換句話說「永遠成功地忽略」。 「成功」是現在時態。這是你可以進行陳述的最遠的地方。 「永遠」不起作用。下一次你問是否有人說英文,nix那部分。它在提出這個問題時非常重要,使用完全清晰的英語......永遠(嘿嘿) –

回答

2

配對鍵(在table_data[0]和值(對方行table_data),並將它們映射到一個哈希:

table_data[1..-1].map { |values| Hash[table_data[0].zip(values)] } 

編輯:部分並不在你的工作如果你做了final_array << hash,它不會像當時那樣添加散列的快照;它會向它添加一個引用因此,你沒有一個數組三個散列,你有一個三個引用相同散列的數組,你可以避免它做final_array << hash.clone實際拍攝快照;或者(更簡單)只需在循環的每次迭代中創建一個新的散列(將hash = {}移動到table_array.each_index循環中)。

+0

謝謝。但是,你能告訴我我的邏輯有什麼問題嗎?我認爲我的直到循環會創建每一個正確的單個散列......並且它確實如此。然後直到結束。但是each_index沒有完成,並且在until循環內保持不變。然後循環應該使x(索引)= 1,並且應該創建與第二個人的新散列。我的散列每次都被覆蓋嗎? –

+0

已編輯。下一次,請也描述你的代碼有什麼問題,不要讓我們運行它或分析它,只是爲了找出你的問題。 – Amadan

1

由於@Amadan診斷您的問題,我會建議一個更「類似Ruby」的方法。

keys, *data = table_data 
    #=> [["first_name", "last_name", "city", "state"], 
    # ["Elisabeth", "Gardenar", "Toledo", "OH"], 
    # ["Jamaal", "Du", "Sylvania", "OH"], 
    # ["Kathlyn", "Lavoie", "Maumee", "OH"] 
    # ] 
keys 
    #=> ["first_name", "last_name", "city", "state"] 
data 
    #=> [["Elisabeth", "Gardenar", "Toledo", "OH"], 
    # ["Jamaal", "Du", "Sylvania", "OH"], 
    # ["Kathlyn", "Lavoie", "Maumee", "OH"] 
    # ] 

[keys].product(data).map { |pair| pair.transpose.to_h } 
    #=> [{"first_name"=>"Elisabeth", "last_name"=>"Gardenar", "city"=>"Toledo", 
    #  "state"=>"OH"}, 
    # {"first_name"=>"Jamaal", "last_name"=>"Du", "city"=>"Sylvania", 
    #  "state"=>"OH"}, 
    # {"first_name"=>"Kathlyn", "last_name"=>"Lavoie", "city"=>"Maumee", 
    #  "state"=>"OH"} 
    # ] 

步驟如下。

a = [keys].product(data) 
    #=> [[["first_name", "last_name", "city", "state"], 
    #  ["Elisabeth", "Gardenar", "Toledo", "OH"] 
    # ], 
    # [["first_name", "last_name", "city", "state"], 
    #  ["Jamaal", "Du", "Sylvania", "OH"]], 
    # [["first_name", "last_name", "city", "state"], 
    #  ["Kathlyn", "Lavoie", "Maumee", "OH"] 
    # ] 
    # ] 

a第一元件傳遞給map,塊變量pair被分配並且執行塊的計算。因此,a.first映射到g。其餘的計算是相似的。

0

您的問題已通過@CarySwoveland和@Amadan正確回答。

我只想補充說,你的表基本上看起來像一個帶表頭的CSV表。

如果您table_data確實來自一個文件,你還不如直接與CSV閱讀:

csv_table = "first_name,last_name,city,state 
Elisabeth,Gardenar,Toledo,OH 
Jamaal,Du,Sylvania,OH 
Kathlyn,Lavoie,Maumee,OH" 

require 'csv' 

CSV.parse(csv_table, headers: true).each do |row| 
    p row 
end 

它輸出

#<CSV::Row "first_name":"Elisabeth" "last_name":"Gardenar" "city":"Toledo" "state":"OH"> 
#<CSV::Row "first_name":"Jamaal" "last_name":"Du" "city":"Sylvania" "state":"OH"> 
#<CSV::Row "first_name":"Kathlyn" "last_name":"Lavoie" "city":"Maumee" "state":"OH"> 

您可以變通CSV::Row與一個哈希。 如果你真的想要一個哈希,你可以使用row.to_h

{"first_name"=>"Elisabeth", "last_name"=>"Gardenar", "city"=>"Toledo", "state"=>"OH"} 
{"first_name"=>"Jamaal", "last_name"=>"Du", "city"=>"Sylvania", "state"=>"OH"} 
{"first_name"=>"Kathlyn", "last_name"=>"Lavoie", "city"=>"Maumee", "state"=>"OH"}