0

我有一个哈希数组...

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'with a 的hash'total_value => 60

4

3 回答 3

2

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

于 2013-04-22T21:06:46.740 回答
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}

通过合并,我的意思是合并总价值。例如,合并上述数组后,应该只有一个 '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}
于 2013-04-22T21:28:08.237 回答
0
array.group_by{|h| h["keyword"]}
.map{|k, v| {
  "keyword" => k,
  "total_value" => v.map{|h| h["total_value"]}.inject(:+)
}}
于 2013-04-23T05:35:05.793 回答