Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在ruby中,如何根据类型和名称键求和?(ruby哈希数组)_Ruby On Rails_Ruby_Ruby On Rails 5 - Fatal编程技术网

Ruby on rails 在ruby中,如何根据类型和名称键求和?(ruby哈希数组)

Ruby on rails 在ruby中,如何根据类型和名称键求和?(ruby哈希数组),ruby-on-rails,ruby,ruby-on-rails-5,Ruby On Rails,Ruby,Ruby On Rails 5,在ruby中,如何根据类型和名称键求和?(ruby哈希数组) 期望输出 [{type: "fruit", name: "apple", count: 3}, {type: "vegetable", name: "pumpkin", count: 5}] 这类问题可以用一个简单的方法来解决 第一个操作根据名称和类型将数组拆分为多个组 {{:name=>"apple", :type=>

在ruby中,如何根据类型和名称键求和?(ruby哈希数组)

期望输出

[{type: "fruit", name: "apple", count: 3},
 {type: "vegetable", name: "pumpkin", count: 5}]

这类问题可以用一个简单的方法来解决

第一个操作根据名称和类型将数组拆分为多个组

{{:name=>"apple", :type=>"fruit"}=>[{:type=>"fruit", :name=>"apple", :count=>2}, {:type=>"fruit", :name=>"apple", :count=>1}], {:name=>"pumpkin", :type=>"vegetable"}=>[{:type=>"vegetable", :name=>"pumpkin", :count=>3}, {:type=>"vegetable", :name=>"pumpkin", :count=>2}]}
然后,我们映射该散列并返回一个散列数组,其中包含类型、名称和总和,输出:

=> [{:name=>"apple", :type=>"fruit", :count=>3}, {:name=>"pumpkin", :type=>"vegetable", :count=>5}]
eatables.inject(Hash.new(0)){h,item|
h[item.slice(:type,:name)]+=item[:count]
H
}.map{k,v|
{**k,计数:v}
}

您好,谢谢您的回复,但您没有选中:namekey@alavnishubham我已经更新了代码来检查
:name
。一个不太“golfy”的版本将是
eatables。每个带有对象(Hash.new(0)){h,memo{h[item.slice(:type,:name)]+=item[:count]}.map{k,v{k.merge(count:v)}
每次迭代修改散列时,每个带有_对象的
都不那么尴尬。@max,我想你的意思是
eatables。每个带有_对象的(hash.new(0)){| h,memo | memo[h.slice(:type,:name)]+=h[:count}.map…
@CarySwoveland-oops,是的,看起来不错。
eatables.group_by { |h| h.slice(:name, :type) }
        .map { |key, grouped| key.merge(count: grouped.sum{ |h| h[:count] }) }
{{:name=>"apple", :type=>"fruit"}=>[{:type=>"fruit", :name=>"apple", :count=>2}, {:type=>"fruit", :name=>"apple", :count=>1}], {:name=>"pumpkin", :type=>"vegetable"}=>[{:type=>"vegetable", :name=>"pumpkin", :count=>3}, {:type=>"vegetable", :name=>"pumpkin", :count=>2}]}
=> [{:name=>"apple", :type=>"fruit", :count=>3}, {:name=>"pumpkin", :type=>"vegetable", :count=>5}]