Ruby 从散列键和值创建对象数组

Ruby 从散列键和值创建对象数组,ruby,arrays,hash,Ruby,Arrays,Hash,我有一个数组中的产品代码集合:@code。然后检查每个产品的实例数量: @popular = Hash.new(0) @codes.each do |v| @popular[v] += 1 end 这会产生类似于{code1=>5,code2=>12}的散列。我真正需要的是一个漂亮的表单数组: [ {:code => code1, :frequency => 5}, {:code => code2, :frequency => 12} ] 如何从生成的哈希值

我有一个数组中的产品代码集合:
@code
。然后检查每个产品的实例数量:

@popular = Hash.new(0)

@codes.each do |v|
    @popular[v] += 1
end
这会产生类似于
{code1=>5,code2=>12}
的散列。我真正需要的是一个漂亮的表单数组:

[ {:code => code1, :frequency => 5}, {:code => code2, :frequency => 12} ]
如何从生成的哈希值构建这样的数组?或者,有没有更直接的路线?所讨论的对象是属性为
:code
的ActiveModel对象。提前谢谢

@popular.map { |k, v| { code: k, frequency: v } }
这将产生一个
散列的数组。如果您需要模型数组,请使用适当的构造函数替换内部的
{…}

将代码更改为

@codes.each_with_object([]) do
  |code, a|
  if h = a.find{|h| h[:code] == code}
    h[:frequency] += 1
  else
    a.push(code: code, frequency: 0)
  end
end
关于速度:

@codes.group_by{|e| e}.map{|k, v| {code: k, frequency: v.length}}

不是最有效的,但这是另一种方式:

def counts(codes)
  codes.uniq.map { |e| { code: e, frequency: codes.count(e) } }
end

codes = %w{code5 code12 code5 code3 code5 code12 code7}
  #=> ["code5", "code12", "code5", "code3", "code5", "code12", "code7"]
counts(codes)
  #=> [{:code=>"code5", :frequency=>3}, {:code=>"code12", :frequency=>2},
  #    {:code=>"code3", :frequency=>1}, {:code=>"code7" , :frequency=>1}]

仅供参考:这是为迭代器提供键和值。如果
@codes
的长度很大,则两步过程会更快,因为
数组#find
不是shed中最锋利的工具。