2015-09-18 2 views
0

Как я могу создать два или более новых хэши из одного хэша, который имеет массивы полей, как например:Разделить хэш на дубликаты хэшей на основе данных массива внутри хэш-Ruby?

{carStyle: "truck", make: ["Ford","Toyota"], model:["Ranger", "Tacoma"]} 

поэтому я хотел два новых хэши, которые приходят, чтобы быть как это:

{carStyle: "truck", make: "Ford", model: "Ranger"} 
{carStyle: "truck", make: "Toyota", model: "Tacoma"} 

Мне было интересно, есть ли способ использовать карту и собирать ее для достижения этой цели? Или если кто-то видел подобный вопрос, который они могли бы указать мне на то, что я, возможно, пропустил.

Заранее благодарен!

+0

будет иметь значение «только для автомобилей», тогда как 'make' и' model' имеют одинаковое число и в соответствующем порядке, поэтому первый make идет с первой моделью и т. Д.? –

+0

да на оба вопроса – jverbe

+0

Приведя пример, полезно назначить все входные объекты переменным (например, 'h = {carStyle: ...}'). Таким образом, ссылки могут быть сделаны с этими переменными в комментариях и ответах без необходимости их определения. –

ответ

1
data = {carStyle: "truck", make: ["Ford","Toyota"], model:["Ranger", "Tacoma"]} 
data[:make].zip(data[:model]).map{|x| 
    { carStyle: data[:carStyle], make: x[0], model: x[1] } 
} 

Марк Рид предложил еще лучшее решение:

data[:make].zip(data[:model]).map{|x,y| 
    { carStyle: data[:carStyle], make: x, model: y } 
} 
+2

Мне это нравится. Вы также можете сделать ... 'map {| x, y | {... make: x, model: y}} 'и избегать индексации. –

+0

Спасибо, @MarkReed, я тоже добавлю ваш ответ – dimakura

+0

Спасибо вам всем! Это отлично работает и направляет меня в правильном направлении. – jverbe

1
h = {carStyle: "truck", make: ["Ford","Toyota"], model: ["Ranger", "Tacoma"]} 

style, makes, models = h.values_at(:carStyle, :make, :model) 
    # => ["truck", ["Ford", "Toyota"], ["Ranger", "Tacoma"]] 

makes.zip(models).map {|make, model| {carStyle: style, make: make, model: model}} 
    #=> [{:carStyle=>"truck", :make=>"Ford", :model=>"Ranger"}, 
    # {:carStyle=>"truck", :make=>"Toyota", :model=>"Tacoma"}] 

Я добавил локальные переменные, чтобы улучшить читаемость.

+0

1 дополнительная строка кода для повышения удобочитаемости стоит того. – engineersmnky

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