[英]Create array of objects from hash keys and values
我有一个数组中的产品代码集合: @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对象。 提前致谢!
@popular.map { |k, v| { code: k, frequency: v } }
这将产生一个Hash
数组。 如果需要模型数组,请使用适当的构造函数替换内部的{...}
。
将您的代码更改为
@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}]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.