Есть много способов сделать это.Вот один;
cars = [
{model: 'nissan', type: 'wingroad'},
{model: 'nissan', type: 'sunny'},
{model: 'nissan', type: 'terrano'},
{model: 'toyota', type: 'hilux'}
]
cars
.group_by { |car| car[:model] }
.map { |model, cars| {name: model, value: cars.map { |car| car[:type] }} }
... Однако, почему вы начинаете с такого нечетного формата данных и намереваетесь закончить с другим нечетным форматом данных?(Под "нечетным" я в основном имею в виду использование массива хэшей массивов для хранения данных.)
Там может быть хорошей причиной для этого (например, интеграция с третьей стороной).API), но в противном случае я бы предложил сделать это как-то более объектно-ориентированным и использовать классы для определения марки / модели автомобилей.Например, что-то вроде:
# e.g. Nissan
class CarMake
attr_reader :name, :models
def initialize(name)
@name = name
@models = []
end
def add_model(name)
model = CarModel.new(name)
@models << model
model.make = self
end
end
# e.g. WingRoad
class CarModel
attr_reader :name
attr_accessor :make
def initialize(name)
@name = name
end
end
# Assuming we still need to start with this data structure!
cars = [
{model: 'nissan', type: 'wingroad'},
{model: 'nissan', type: 'sunny'},
{model: 'nissan', type: 'terrano'},
{model: 'toyota', type: 'hilux'}
]
car_makes = {}
cars.each do |car|
car_makes[car[:model]] ||= CarMake.new(car[:model])
car_makes[car[:model]].add_model(car[:type])
end
Это только один из многих возможных способов организации кода, и, хотя поначалу это может быть немного сложнее для понимания, результирующая структура данных гораздо болееполезно:
car_makes
=> {"nissan"=>
#<CarMake:0x00007ff2ee44ad20
@models=
[#<CarModel:0x00007ff2ee44aca8 @make=#<CarMake:0x00007ff2ee44ad20 ...>, @name="wingroad">,
#<CarModel:0x00007ff2ee44ac80 @make=#<CarMake:0x00007ff2ee44ad20 ...>, @name="sunny">,
#<CarModel:0x00007ff2ee44ac58 @make=#<CarMake:0x00007ff2ee44ad20 ...>, @name="terrano">],
@name="nissan">,
"toyota"=>#<CarMake:0x00007ff2ee44ac30 @models=[#<CarModel:0x00007ff2ee44ab68 @make=#<CarMake:0x00007ff2ee44ac30 ...>, @name="hilux">], @name="toyota">}
car_makes['nissan'].models
=> [#<CarModel:0x00007ff2ee44aca8 @make=#<CarMake:0x00007ff2ee44ad20 @models=[...], @name="nissan">, @name="wingroad">,
#<CarModel:0x00007ff2ee44ac80 @make=#<CarMake:0x00007ff2ee44ad20 @models=[...], @name="nissan">, @name="sunny">,
#<CarModel:0x00007ff2ee44ac58 @make=#<CarMake:0x00007ff2ee44ad20 @models=[...], @name="nissan">, @name="terrano">]
car_makes['nissan'].models.first
=> #<CarModel:0x00007ff2ee44aca8
@make=
#<CarMake:0x00007ff2ee44ad20
@models=
[#<CarModel:0x00007ff2ee44aca8 ...>,
#<CarModel:0x00007ff2ee44ac80 @make=#<CarMake:0x00007ff2ee44ad20 ...>, @name="sunny">,
#<CarModel:0x00007ff2ee44ac58 @make=#<CarMake:0x00007ff2ee44ad20 ...>, @name="terrano">],
@name="nissan">,
@name="wingroad">
car_makes['nissan'].models.first.make
=> #<CarMake:0x00007ff2ee44ad20
@models=
[#<CarModel:0x00007ff2ee44aca8 @make=#<CarMake:0x00007ff2ee44ad20 ...>, @name="wingroad">,
#<CarModel:0x00007ff2ee44ac80 @make=#<CarMake:0x00007ff2ee44ad20 ...>, @name="sunny">,
#<CarModel:0x00007ff2ee44ac58 @make=#<CarMake:0x00007ff2ee44ad20 ...>, @name="terrano">],
@name="nissan">
... И так далее.Теперь у нас есть структурированные данные, а не просто произвольные (и с неправильным именем!) Смеси массивов и хешей, которыми сложно манипулировать.