2017-01-30 10 views
-2

Я пытаюсь превратить массив массивов в массив хешей. Может ли кто-нибудь попытаться объяснить, что я точно делаю неправильно здесь? Первый массив в массиве массивов становится ключом для хэша. Я могу заставить метод возвращать один хэш или даже три из тех же хэшей. Но я не могу заставить его возвращать каждый новый хэш в конечном массиве.не может определить массив хэшей 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

Я говорю по-английски. Я не знал, как работает этот сайт. Теперь я знаком, и я просматриваю свои вопросы и выбираю правильный ответ. Я вижу ценность и необходимость в этом. Не нужно ПРОТИВАТЬ и оскорблять. Если вы хотите быть ничтожным в отношении грамматики, я бы перефразировал «успешно игнорируя навсегда». «Успешно» присутствует напряженное время. Это самое дальнее, что вы можете нести свое заявление. «Навсегда» просто не работает. В следующий раз, когда вы спросите, говорит ли кто-нибудь по-английски, nix эту часть. Его жизненно важно, задавая этот вопрос, использовать совершенно понятный английский ... навсегда (хе-хе) –

ответ

2

пара клавиши вверх (в table_data[0] и значения (друг друга строк в table_data) с помощью zip, и сопоставить их с хэш:

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

EDIT: часть, которая не работает в вашей Если у вас есть final_array << hash, он не добавляет моментальный снимок хэша, как он есть, он добавляет ссылку . Таким образом, у вас нет массива три хэша, у вас есть массив с тремя ссылками на один и тот же хеш. делать final_array << hash.clone, чтобы сделать снимок; или (намного проще), просто создайте новый хэш на каждой итерации цикла (переместите hash = {} в цикл table_array.each_index).

+0

спасибо. Но не могли бы вы рассказать мне, что случилось с моей логикой? Я решил, что до тех пор, пока цикл не создаст каждый правильный одиночный хэш ... и это произойдет. Затем до конца. Но each_index не выполняется и остается неизменным в пределах цикла while. Тогда цикл должен сделать x (индекс) = 1, а новый хэш со вторым человеком должен быть создан. Мой хэш только что перезаписывается каждый раз? –

+0

Отредактировано. В следующий раз, пожалуйста, также расскажите, что не так с вашим кодом, не заставляйте нас запускать его или анализировать, просто чтобы узнать, в чем проблема. – Amadan

1

Как @Amadan поставил диагноз вашей проблемы, я предложу более «рубиновый» подход.

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. Остальные вычисления аналогичны.

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, как с Hash. Если вы действительно хотите хэша, вы можете использовать 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"} 

 Смежные вопросы

  • Нет связанных вопросов^_^