用另一个哈希填充哈希值

时间:2019-08-13 16:49:26

标签: ruby

我的哈希值中包含更多值:

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]}

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

2 个答案:

答案 0 :(得分:3)

如果您使用的是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}

答案 1 :(得分:0)

Yea Aleksei Matiushkin是完全正确的。 transform_values具有破坏性版本和非破坏性版本。破坏性版本具有所谓的爆炸或感叹号,因此:transform_values!被读取为变换值bang,它将改变您的原始哈希。另一方面,transform_values返回一个新数组,而不更改原始数组,因此是非破坏性的。据我所知,您想处理非破坏性版本。

在这种情况下,您可以运行hash1.transform_values { |values| values.values.sum }来返回新的哈希,但是,由于这是非破坏性的,因此hash1仍将等于原始的hash1。因此,您想将hash2设置为等于转换值。

基本上发生的是散列遍历与键关联的所有值,并获取这些键值(由于您具有多维散列)并将它们加在一起。

这是一个很棒的链接,供您查看! https://blog.bigbinary.com/2017/06/14/ruby-2-4-added-hash-transform-values-and-its-destructive-version-from-active-support.html