首页 > 解决方案 > 用另一个哈希填充哈希值

问题描述

我有一个带有更多值的哈希值:

hash1 = {
  :a => {
    :foo => 435,
    :bar => 3264
  },
  :b => {
    :foo => 45234,
    :bar => 2452
  },
  :c => {
    :foo => 4352,
    :bar => 4535
  }
}

我需要将 a、b 和 c 的总和添加到新数组中


hash2 = {
  :a => total,
  :b => total,
  :c => total
}

到目前为止,我的尝试是这样的: hash2.each {|e,v| v = hash1[0]}

挣扎,所以我需要一些帮助!谢谢!

标签: ruby

解决方案


如果您使用的是 Ruby 版本 >= 2.4,您可以这样做

hash2 = hash1.transform_values { |v| v.values.sum }
=>{:a=>3699, :b=>47686, :c=>8887}

感谢 @3limin4t0r 和 @Aleksei Matiushkin 为 Ruby 版本 < 2.4 提供了一种更简洁的方式,请参阅评论

hash2 = Hash[hash1.map { |k, v| [k, v.values.reduce(0, &:+)] }]
=> {:a=>3699, :b=>47686, :c=>8887}
# or if your prefer each_with_object
hash1.each_with_object({}) { |(k, v), h| h[k] = v.values.reduce(0, &:+) }
=> {:a=>3699, :b=>47686, :c=>8887}

原件留在这里供大家交流

否则你可以这样做,可能有更快的方法,但它有效

hash2 = {}
sum_vals = hash1.values.map{|h| h.values.inject(&:+)}
hash1.keys.each_with_index{|key, i| hash2[key] = sum_vals[i] }
hash2
=>{:a=>3699, :b=>47686, :c=>8887}

推荐阅读