Ruby 对嵌套哈希上的元素求和
我使用MongoDB存储聚合信息。类似于下面的散列,我们可以看到有多少客户按性别、年龄和地区进行分组(实际数据结构有5个级别): 生意人喜欢接触每一点信息。考虑到这一点,我正在尝试编写一个方法,该方法接收这样的散列,一个嵌套级别数组和他们想要查询的嵌套属性,以返回该类型的客户数量 示例:如果我们想要检索年轻客户的数量,样板应该是这样的:Ruby 对嵌套哈希上的元素求和,ruby,hash,Ruby,Hash,我使用MongoDB存储聚合信息。类似于下面的散列,我们可以看到有多少客户按性别、年龄和地区进行分组(实际数据结构有5个级别): 生意人喜欢接触每一点信息。考虑到这一点,我正在尝试编写一个方法,该方法接收这样的散列,一个嵌套级别数组和他们想要查询的嵌套属性,以返回该类型的客户数量 示例:如果我们想要检索年轻客户的数量,样板应该是这样的: levels = %i(gender age region) young_custumers = sum_method(customers, levels, {
levels = %i(gender age region)
young_custumers = sum_method(customers, levels, {age: :young})
这将返回年轻客户的数量:18
有人知道这样做的一个高雅的方式吗? < P>这是一个你可能想考虑的方法。< /P> 代码
def sum_em(h, filter)
f = filter.first
f = h.keys if f == :all
if h[f.first].is_a? Hash
f.reduce(0) { |t,k| t+sum_em(h[k], filter.drop(1)) }
else
f.reduce(0) { |t,k| t+h[k] }
end
end
示例
这些示例适用于您的散列客户
sum_em customers, [:all, [:young], :all] #=> 18
sum_em customers, [[:male], [:young], :all] #=> 3
sum_em customers, [[:female], [:young], :all] #=> 15
sum_em customers, [:all, [:young, :adult], [:american]] #=> 24
sum_em customers, [:all, :all, [:american]] #=> 42
sum_em customers, [:all, :all, :all] #=> 78
这当然适用于任何级别
sum_em customers, [:all, [:young], :all] #=> 18
sum_em customers, [[:male], [:young], :all] #=> 3
sum_em customers, [[:female], [:young], :all] #=> 15
sum_em customers, [:all, [:young, :adult], [:american]] #=> 24
sum_em customers, [:all, :all, [:american]] #=> 42
sum_em customers, [:all, :all, :all] #=> 78