我的哈希值中包含更多值:
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]}
苦苦挣扎,所以我需要一些帮助!谢谢!
答案 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