如何用从值创建并按值分组的键创建散列对象?

cars = [{
  id: 1,
  properties: {
    name: "audi",
    type: "petrol"
  },
},{
  id: 1,
  properties: {
    name: "ford",
    type: "petrol"
  }
},{
  id: 1,
  properties: {
    name: "tesla",
    type: "electric"
  }
}]

预期效果:
{
  petrol: [{name: "audi"}, {name: "ford"}],
  electric: [{name: "tesla"}]
}

我当前的函数提供了所需的效果,但它太长了,如何用较短的代码获得相同的效果?
cars.map { |c| Hash[c[:properties][:type], c[:properties][:name]] }.group_by{|h| h.keys.first}.each_value{|a| a.map!{|h| h.values.first}}

最佳答案

我想出了这样的办法。应将grouped_cars变量提取到单独的方法中。

grouped_cars = cars.inject({}) do |result, car|
  result[car[:properties][:type]] ||= []
  result[car[:properties][:type]] << { name: car[:properties][:name] }
  result
end

{ cars: grouped_cars }

10-08 06:21
查看更多