【问题标题】:Sum the value of array in hash对哈希中数组的值求和
【发布时间】:2011-04-13 06:47:59
【问题描述】:

这是我的数组

[{:amount=>10, :gl_acct_id=>1, :alt_amount=>20}, {:amount=>20, :gl_acct_id=>2
, :alt_amount=>30}]

我想要结果

[{:amount => 30}] or {:amount = 30}

有什么想法吗?

【问题讨论】:

    标签: ruby hash


    【解决方案1】:

    您可以使用inject 汇总所有金额。然后,如果需要,您可以将结果放回哈希中。

    arr = [{:amount=>10, :gl_acct_id=>1, :alt_amount=>20}, {:amount=>20, :gl_acct_id=>2, :alt_amount=>30}]    
    amount = arr.inject(0) {|sum, hash| sum + hash[:amount]} #=> 30
    {:amount => amount} #=> {:amount => 30}
    

    【讨论】:

    • 谢谢@sepp2k 这非常有用。在上面的答案中,我们必须命名键 - 如果我们想要所有键的总和 - (即我们不想单独命名它们 - 你知道我们将如何解决这个问题吗?)
    • 我也有同样的问题,我的哈希是 [2, #<7f29fe6164b0><7f29fe6163e8><7f29fe6162a8>
    【解决方案2】:

    这是一种方法:

    a = {amount:10,gl_acct_id:1,alt_amount:20},{amount:20,gl_acct_id:2,alt_amount:30}
    a.map {|h| h[:amount] }.reduce(:+)
    

    但是,我感觉您的对象模型有些欠缺。使用更好的对象模型,您可能可以执行以下操作:

    a.map(&:amount).reduce(:+)
    

    甚至只是

    a.sum
    

    请注意,正如@sepp2k 指出的那样,如果您想取出Hash,则需要再次将其包装在Hash 中。

    【讨论】:

    • @mittag 你能告诉我什么应该是更好的对象模型吗?所以我可以使用这个... a.map(&:amount).reduce(:+)
    • @krunal:最基本的例子:Foo = Struct.new(:amount, :gl_acct_id, :alt_amount); a = [Foo.new(10, 1, 20), Foo.new(20,2,30)]; a.map(&amp;:amount).inject(:+) #=&gt; 30
    • @sepp2k:谢谢!错过了那个。
    【解决方案3】:
    total=0
    arr = [{:amount=>10, :gl_acct_id=>1, :alt_amount=>20}, {:amount=>20, :gl_acct_id=>2, :alt_amount=>30}]
    arr.each {|x| total=total+x[:amount]}
    puts total
    

    【讨论】:

    • 大部分相当于这个单行:total = arr.inject(0) {|sum, hash| sum += hash[:amount]}
    【解决方案4】:

    array.map { |h| h[:amount] }.sum

    【讨论】:

    • 在使用 rails 时,可能会更短:array.sum {|h| h[:金额]}
    • 这会创建一个临时数组,可以避免。
    【解决方案5】:
    [{
        :amount=>10,
        :gl_acct_id=>1,
        :alt_amount=>20
    },{
        :amount=>20,
        :gl_acct_id=>2,
        :alt_amount=>30
    }].sum { |t| t[:amount] }
    

    【讨论】:

    • 欢迎来到 Stack Overflow!通常最好解释你的答案,而不是仅仅发布代码。
    • 欢迎来到 Stack Overflow!尽管此代码可能有助于解决问题,但它并没有解释 why 和/或 如何 回答问题。提供这种额外的背景将显着提高其长期教育价值。请edit您的答案添加解释,包括适用的限制和假设。
    【解决方案6】:

    Ruby 版本 >= 2.4.0 有一个 Enumerable#sum 方法。所以你可以做

    arr.sum {|h| h[:amount] }
    

    【讨论】:

    • 恕我直言可能是最好的答案
    • 但这会返回 30 而不是想要的结果 [{:amount => 30}] 或 {:amount = 30}
    • @tvw 一旦你得到总和,这是微不足道的。此答案也是在 OP 提出问题 6 年后发布的。所以我的意图是帮助任何来到这里遇到类似问题的人。 :)
    【解决方案7】:

    为什么不采摘?

    ary = [{:amount=>10, :gl_acct_id=>1, :alt_amount=>20}, {:amount=>20, :gl_acct_id=>2, :alt_amount=>30}]
    
    ary.pluck(:amount).sum
    
    # for more reliability
    ary.pluck(:amount).compact.sum
    

    【讨论】:

    【解决方案8】:

    如果我们在一个数组的所有哈希中只有一个元素,而且键也不同?

    这是我找到的解决方案:

    值的总和:

    x = [{"a" =&gt; 10},{"b" =&gt; 20},{"d" =&gt; 30}]

    解决方案:

    x.inject(0){|sum, hash| sum+= hash.values.join.to_i }

    我们也可以这样做:

    x.inject(0){|sum, hash| sum+= hash.values.sum }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      相关资源
      最近更新 更多