从哈希键和值创建对象数组

时间:2014-08-11 01:19:38

标签: ruby arrays hash

我在数组中有一组产品代码:@codes。然后我检查一下每种产品的实例数量:

@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对象。提前谢谢!

3 个答案:

答案 0 :(得分:1)

@popular.map { |k, v| { code: k, frequency: v } }

这将产生Hash es的数组。如果需要模型数组,请用适当的构造函数替换内部{...}

答案 1 :(得分:1)

将您的代码更改为

@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}}

答案 2 :(得分:0)

效率不高,但这是另一种方式:

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}]