我有一系列散列:

[{"Vegetable"=>10}, {"Vegetable"=>5}, {"Dry Goods"=>3>}, {"Dry Goods"=>2}]

我想我需要用inject,但我一直在努力.

我想要一个新的散列,它反映了前一个散列的重复密钥的总和:

[{"Vegetable"=>15}, {"Dry Goods"=>5}]

我控制着输出这个散列的代码,以便在必要时修改它.结果主要是散列,因为这可能会嵌套任意深度的级别,然后很容易在数组上调用flatten,但也不会展平散列的键/值:

def recipe_pl(parent_percentage=nil)
  ingredients.collect do |i|

    recipe_total = i.recipe.recipeable.total_cost 
    recipe_percentage = i.ingredient_cost / recipe_total

    if i.ingredientable.is_a?(Purchaseitem)
      if parent_percentage.nil?
        {i.ingredientable.plclass => recipe_percentage}
      else
        sub_percentage = recipe_percentage * parent_percentage
        {i.ingredientable.plclass => sub_percentage}
      end
    else
      i.ingredientable.recipe_pl(recipe_percentage)
    end
  end
end 

推荐答案

ar = [{"Vegetable"=>10}, {"Vegetable"=>5}, {"Dry Goods"=>3}, {"Dry Goods"=>2}]
p ar.inject{|memo, el| memo.merge( el ){|k, old_v, new_v| old_v + new_v}}
#=> {"Vegetable"=>15, "Dry Goods"=>5}

Hash.merge块,当它找到一个重复的块时运行该块;没有初始值memoinject将数组的第一个元素视为memo,这在这里很好.

Ruby相关问答推荐

每秒做某事 x 次

从 ruby​​ 脚本运行另一个 ruby​​ 脚本

我在哪里可以找到积极开发的 Ruby lint 工具?

在 Ruby 中覆盖 == 运算符

将ruby数组转换为连续对数组

Ruby 在与源相同的目录中加载配置(yaml)文件

确保如何在 ruby​​ 中工作

如何判断是否安装了gem?

在 Pry 中有相当于 next 的吗?

Ruby Koan 151 引发异常

如何使用 Ruby OptionParser 指定所需的switch (不是参数)?

rails 控制台、RVM 和 readline 的问题

在Ruby中实现平等的正确方法是什么

Ruby 中的文件打开模式

如何通过反射获得活动记录关联

如何传递函数而不是块

不能在windows上安装thin

如何从Ruby中的哈希表中获取第一个键值对

如何在器上下文中运行 ruby​​ 脚本?

Docker for Mac - mkmf.rb 找不到 ruby​​ 的头文件