2017-01-30 8 views
-2

配列の配列をハッシュの配列に変換しようとしています。誰かが私がここで間違っていることを説明しようとすることができますか?配列の配列内の最初の配列がハッシュのキーになります。私は同じハッシュの1つのハッシュまたは3つを返すメソッドを得ることができます。しかし、私はそれが最終的な配列内の異なる別の新しいハッシュを返すことはできません。はハッシュの配列を見つけることができません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" } 
+1

あなたが英語を話す行う場合、あなたは成功し永遠に無視している以下のコメントを、お読みください:\t ***私は、あなたが受け入れることはありません気づきましたあなたの質問に答えます。あなたの質問をしばらく見直して、彼らがあなたの質問を解決した場合に最良の答えを受け入れるようにしてください。このようにして、問題を解決し、解決策を提供した人の努力に同時に報酬を与えるということをコミュニティに知らせます。答えを受け入れるには、回答スコアの下のチェックマークを探してください。*** –

+0

MCVEは提供されていませんが、質問はありません。 Downvoted。 – mudasobwa

+0

私は英語を話します。私はこのサイトの仕組みに慣れていませんでした。今私はよく知っていて、私の質問を通り、正しい答えを選んでいます。私はそうすることの価値と必要性を見ています。 TRYと侮辱する必要はありません。あなたが文法について卑劣なことをしたいのであれば、私は「永遠に無視してうまくいく」と言い換えるでしょう。 "成功"は現在の緊張です。それはあなたの声明を運ぶことができる限りです。 「永遠に」はうまくいきません。次回は誰かが英語を話すかどうか聞いています。その質問をしながら生きている、完全にクリアな英語を使用する...永遠に(hehe) –

答えて

2

ペアアップtable_data[0]のキー(と値(table_dataで互いに行)zipを使用して、ハッシュにマップ:

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

EDIT:一部では動作しませんあなたあなたが再利用し続ける1つのハッシュを持っている場合final_array << hashを実行すると、ハッシュのスナップショットがそのまま追加されず、参照が追加されます。 3つのハッシュを持つ場合、同じハッシュへの3つの参照を持つ配列があります。実際にスナップショットを撮るにはfinal_array << hash.cloneを実行してください。ループの各繰り返しで新しいハッシュを作成するだけです(hash = {}table_array.each_indexループに移動してください)。

+0

ありがとう。しかし、私の論理に何が間違っているのか教えていただけますか?私は、untilループがすべての正しい単一のハッシュを作成すると考えました...そして、そうします。その後、終わりが終わります。しかし、each_indexは実行されず、untilループ内で同じ状態を維持します。次に、ループはx(インデックス)= 1にし、2番目の人物との新しいハッシュを作成する必要があります。私のハッシュはたびに上書きされますか? –

+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が割り当てられ、ブロック演算を行います。

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.firstgにマッピングされます。残りの計算は似ています。

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働くことができる

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

出力します。 あなたが本当にハッシュをしたい場合、あなたは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"} 
関連する問題