合并重复的数组项(Consolidating duplicate array items)

2019-08-31 20:07发布

我有散列的数组...

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

Answer 1:

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。 例如,在上述阵列的固结后,应该只有一个散列与“关键字” =>“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}


Answer 2:

当你将项目添加到集合的简单的方法是这样做的。 开始添加项目,检查是否关键字是存在的。 如果(a)它的存在,则只需添加新项目的total_value它。 其他(二)新项目添加到集合。



Answer 3:

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


文章来源: Consolidating duplicate array items
标签: ruby arrays hash