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]}
挣扎,所以我需要一些帮助!谢谢!
解决方案
如果您使用的是 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}
推荐阅读
- mysql - 加入计算的列值无法给出预期的结果
- postgresql - 在 PostGIS 中使用 ST_Within 显示位于多个重叠/相交多边形内的点
- r - 如何在R中的直方图中将对数比例添加到y轴
- debugging - GDB:手动注入调试符号
- c++ - 是否可以在不使用 stderr、stdin 或 stdout 的情况下使用管道在 2 个进程之间创建通信流?
- saml - ADFS 单次注销失败并显示请求者状态代码
- python - jupyter 实验室搜索/在输出中查找 - 快捷方式
- python - 我需要分组并用最小值-最大值覆盖一列
- macos - 在 Mac 上使用外部程序查看数据库
- java - 将 JSON(不是由 AVRO 生成)转换为 Avro 特定记录