【发布时间】:2018-05-22 02:00:32
【问题描述】:
问题:将具有相同值的哈希数组与指定键的值合并,并找到其他键的平均值。
我的解决方案似乎很难看
数据:
require 'pp'
arr = [{:red=>346.0,
:unu=>10.0,
:used=>20147.0,
:acc_id=>550,
:percent=>0.01},
{:red=>0.0,
:unu=>1.0,
:used=>66.0,
:acc_id=>550,
:percent=>0.06},
{:red=>120.0,
:unu=>11.0,
:used=>166.0,
:acc_id=>550,
:percent=>10.06},
{:red=>1306.0,
:unu=>1.0,
:used=>13259.0,
:acc_id=>9999,
:percent=>0.0}]
在当前示例中,我们应该将 3 个哈希与 (:acc_id = 550) 合并,结果数组应包含两个哈希(合并哈希与 :acc_id = 550 和未触及哈希与 :acc_id = 9999)
算法:
data = []
arr.group_by{|h| h[:acc_id] }.map {|_, arr_of_hashes|
sz = arr_of_hashes.size
if sz > 1
arr_of_hashes = arr_of_hashes.inject{|memo, el|
memo.merge(el) {|k, old_v, new_v| old_v + new_v}
}
arr_of_hashes.map {|k, v| arr_of_hashes[k] = v / sz}
end
data << arr_of_hashes if arr_of_hashes.is_a? Hash
data << arr_of_hashes[0] if arr_of_hashes.is_a? Array
}
pp data
预期结果: 合并哈希数组
[{:red=>155.33333333333334,
:unu=>7.333333333333333,
:used=>6793.0,
:acc_id=>550,
:percent=>3.376666666666667},
{:red=>1306.0,
:unu=>1.0,
:used=>13259.0,
:acc_id=>9999,
:percent=>0.0}]
... ... ...
【问题讨论】:
-
当你给出一个例子时,你应该总是展示你想要的结果。
-
我假设你想要每个键的平均值,取自
arr中的所有哈希值。对吗? -
@CarySwoveland 添加了预期结果。我想合并具有相同键值的哈希(在当前示例中为 :acc_id )并找到所有其他键的平均值
-
对于您的示例,“指定密钥”是什么?
-
@CarySwoveland :acc_id。还在描述中添加了一些解释