簡體   English   中英

無法找出哈希紅寶石數組

[英]can't figure out array of hashes ruby

我正在嘗試將數組數組轉換為哈希數組。 有人可以在這里解釋我到底在做什么錯嗎? 數組數組中的第一個數組成為哈希鍵。 我可以獲得返回一個哈希值甚至三個相同哈希值的方法。 但是我不能讓它在最終數組中返回每個不同的新哈希。

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" }

使用zip將鍵(在table_data[0]和值(在table_data每一行) 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循環中)。

由於@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並執行塊計算。

pair = a.first
  #=> [["first_name", "last_name", "city", "state"],
  #    ["Elisabeth", "Gardenar", "Toledo", "OH"]
  #   ] 
b = pair.transpose
  #=> [["first_name", "Elisabeth"],
  #    ["last_name", "Gardenar"],
  #    ["city", "Toledo"],
  #    ["state", "OH"]
  #   ] 
g = b.to_h
  #=> {"first_name"=>"Elisabeth", "last_name"=>"Gardenar", "city"=>"Toledo",
  #      "state"=>"OH"} 

因此, a.first映射到g 其余計算類似。

@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"}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM