2013-11-19 3 views
0

Мне нужно использовать следующие данные для построения массива хэшей. Первым элементом в массиве должно быть:Преобразование нескольких массивов в отдельные хэши внутри одного массива

{ 
    salutation: 'Mr.' 
    first_name: 'John', 
    last_name: 'Dillinger', 
    address: '33 Foolish Lane, Boston MA 02210' 
} 

Данные приведены ниже. Я действительно пытаюсь понять, как это сделать. Некоторая помощь будет принята с благодарностью, поскольку я нахожусь в конце концов!

salutations = [ 
    'Mr.', 
    'Mrs.', 
    'Mr.', 
    'Dr.', 
    'Ms.' 
] 

first_names = [ 
    'John', 
    'Jane', 
    'Sam', 
    'Louise', 
    'Kyle' 
] 

last_names = [ 
    'Dillinger', 
    'Cook', 
    'Livingston', 
    'Levinger', 
    'Merlotte' 
] 

addresses = [ 
    '33 Foolish Lane, Boston MA 02210', 
    '45 Cottage Way, Dartmouth, MA 02342', 
    "54 Sally's Court, Bridgewater, MA 02324", 
    '4534 Broadway, Boston, MA 02110', 
    '4231 Cynthia Drive, Raynham, MA 02767' 
] 

Единственное решение, с которым я смог придумать, не работает. Любая идея, почему ???

array_of_hashes = [] 
array_index = 0 

def array_to_hash (salutations, first_names, last_names, addresses) 
    while array_index <= 5 
    hash = {} 
    hash[salutation] = salutations(array_index) 
    hash[first_name] = first_names(array_index) 
    hash[last_name] = last_names(array_index) 
    hash[address] = addresses(array_index) 
    array_of_hashes << hash 
    array_index += 1 
    end 
end 

array_to_hash(salutations,first_names,last_names,addresses) 

EDIT - С помощью вас, ребята, я был в состоянии получить мое разрешение на работу:

def array_to_hash (salutations, first_names, last_names, addresses) 
    array_of_hashes = [] 
    array_index = 0 
    while array_index <= 4 
    hash = {} 
    hash[:salutation] = salutations[array_index] 
    hash[:first_name] = first_names[array_index] 
    hash[:last_name] = last_names[array_index] 
    hash[:address] = addresses[array_index] 
    array_of_hashes << hash 
    array_index += 1 
    end 
    puts array_of_hashes 
end 

array_to_hash(salutations,first_names,last_names,addresses) 

ответ

3
[salutations, first_names, last_names, addresses].transpose 
.map{|a| Hash[%i[salutation first_name last_name address].zip(a)]} 
+0

'salutations.zip (first_names, last_names, addresses) .map ...'? :) – fl00r

+0

@ fl00r Привет. Это тоже работает, но я уважал симметрию здесь. – sawa

+0

Спасибо @sawa, оцените помощь. Единственное решение, которое я смог придумать самостоятельно, теперь также упоминается в вопросе. Любая идея, почему это не работает? – John

2
5.times.map do |x| 
    {  
    salutation: salutations[x], 
    first_name: first_names[x], 
    last_name: last_names[x], 
    address: addresses[x] 
    } 
end 

или если вы не уверены, что это будет только пять пунктов в каждый массив, заменить 5.times, например salutations.length.times.

+0

Спасибо Zippie. В этом случае x будет стоять за индекс в приветствиях массивов, first_names, last_names и адресах? – John

+0

Да, x - это индекс – Zippie

0
keys = [:salutations, :first_names, :last_names, :addresses] 
data = [ salutations, first_names, last_names, addresses].transpose 

data.map!{|person| Hash[keys.zip(person)]} 
0

Вы должны пройти, вы должны пройти array_index в качестве параметра, потому что вы не можете получить доступ к переменным вне метода.

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