合并重复的数组项

时间:2013-04-22 21:03:38

标签: ruby arrays hash

我有一系列哈希......

array = [
{
    'keyword' => 'A',
    'total_value' => 50
},
{
    'keyword' => 'B',
    'total_value' => 25
},
{
    'keyword' => 'C',
    'total_value' => 40
},
{
    'keyword' => 'A',
    'total_value' => 10
},
{
    'keyword' => 'C',
    'total_value' => 15
}]

我需要合并具有相同keyword值的哈希值。通过合并,我的意思是合并total_values。例如,在合并上述数组之后,应该只有一个带有'keyword' => 'A' 'total_value => 60

的哈希

3 个答案:

答案 0 :(得分:2)

在向集合中添加项目时,一个简单的方法就是这样做。开始添加项目,检查关键字是否存在。如果(a)它在那里,那么只需将新项目的total_value添加到其中。否则(b)将新项目添加到集合中。

答案 1 :(得分:2)

array =  [
{
    'keyword' => 'A',
    'total_value' => 50
},
{
    'keyword' => 'B',
    'total_value' => 25
},
{
    'keyword' => 'C',
    'total_value' => 40
},
{
    'keyword' => 'A',
    'total_value' => 10
},
{
    'keyword' => 'C',
    'total_value' => 15
}]

m = array.inject(Hash.new(0)) do |hs,i| 
    hs[i['keyword']] += i['total_value'] 
    hs 
end
p m

输出:

{"A"=>60, "B"=>25, "C"=>55}
  

通过合并,我的意思是组合total_values。例如,在合并上面的数组之后,应该只有一个带有'keyword'=>的哈希值。 'a'的'total_value => 60

以下是如何做到的:

m = array.each_with_object(Hash.new(0)) do |h,ob| 
     if h['keyword'] == 'A'
        h['total_value'] += ob['total_value']
        ob.update(h)
     end
end
p m
#=> {"keyword"=>"A", "total_value"=>60}

答案 2 :(得分:0)

array.group_by{|h| h["keyword"]}
.map{|k, v| {
  "keyword" => k,
  "total_value" => v.map{|h| h["total_value"]}.inject(:+)
}}