Как мне отформатировать массив объектов с помощью ruby? - PullRequest
0 голосов
/ 24 апреля 2018

Я немного растерялся, как отформатировать этот массив объектов.

Начальный массив:

cars = [{model: 'nissan', type: 'wingroad'},{model: 'nissan', type: 'sunny'},{model: 'nissan', type: 'terrano'},{model: 'toyota', type: 'hilux'}]

Ожидаемый результат:

formatted_cars = [{name: 'nissan', value: ['wingroad', 'sunny', 'terrano']}, {name: 'toyota', value: ['hilux']

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

Я новичок в ruby ​​и буду рад любой помощи, спасибо:)

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018
cars = [{model: 'nissan', type: 'wingroad'},
        {model: 'nissan', type: 'sunny'},
        {model: 'nissan', type: 'terrano'},
        {model: 'toyota', type: 'hilux'}]

cars.each_with_object({}) { |g,h| (h[g[:model]] ||= []) << g[:type] }.
     map { |k,v| { model:k, type:v } }
  #=> [{:model=>"nissan", :type=>["wingroad", "sunny", "terrano"]},
  #    {:model=>"toyota", :type=>["hilux"]}]

Обратите внимание, что

cars.each_with_object({}) { |g,h| (h[g[:model]] ||= []) << g[:type] }
  #=> {"nissan"=>["wingroad", "sunny", "terrano"], "toyota"=>["hilux"]}
0 голосов
/ 25 апреля 2018

Да, есть следующее:

cars.group_by{|h| h[:model]}.transform_values{|v| v.map{|h| h[:type]}}
#=> {"nissan"=>["wingroad", "sunny", "terrano"], "toyota"=>["hilux"]}
0 голосов
/ 25 апреля 2018

Есть много способов сделать это.Вот один;

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

... И так далее.Теперь у нас есть структурированные данные, а не просто произвольные (и с неправильным именем!) Смеси массивов и хешей, которыми сложно манипулировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...