ruby - 如何根据数组中对象的两个属性创建哈希?

标签 ruby sum

假设我有以下类,product.rb:

require 'yaml'

class Product
    attr_accessor :id, :price

    def initialize args = {}
        options = {:id => "", :price => 0}.merge(args)
        self.id, self.price = options[:id], options[:price]
    end

    def inspect
        self.to_yaml        
    end
end

以及下面的示例程序,example.rb:

require_relative 'product'

products = Array.new

(1..5).each do |n| # Create 5 products with random id and price
    products << Product.new(
        :id => rand(1..5),
        :price => rand(10..50))
end

products.each { |p| puts p.inspect }

运行 example.rb 的示例输出:

C:\>ruby example.rb
--- !ruby/object:Product
id: 3
price: 48
--- !ruby/object:Product
id: 2
price: 47
--- !ruby/object:Product
id: 5
price: 32
--- !ruby/object:Product
id: 5
price: 49
--- !ruby/object:Product
id: 3
price: 33

结果是具有重复 ID 的 Product 类型的对象数组。

如何创建一个以 id 为键,价格之和为值的散列?

期望结果示例:

{ "2" => 47, "3" => 81, "5" => 81 } # { id => sum of price }

最佳答案

您可以使用each_with_object 来注入(inject)默认值为 0 的哈希,如下所示:

products.each_with_object(Hash.new(0)) { |p, 结果|结果[p.id] += p.price }

关于ruby - 如何根据数组中对象的两个属性创建哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41428856/

相关文章:

html - 如何将所有类 ="..."属性扩展为样式 ="..."?

ruby - 如何向后运行 Ruby 函数?

Ruby 遍历所有模型对象,操作每个对象并添加到 CSV

gridview - Yii2 - 如何对 GridView 中的列求和?

python-3.x - 通过 pandas 对 csv 文件中列中字符串的出现次数求和

mysql - 使用组总和的 SQL View ,并根据订单中的商品数量拆分运费

ruby - 如何理解这段寻找最长单词的代码

ruby - 续集迁移器未定义

mysql - 对显示所有结果的多列求和

java - 在范围内添加整数不适用于负数