Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 对嵌套哈希上的元素求和_Ruby_Hash - Fatal编程技术网

Ruby 对嵌套哈希上的元素求和

Ruby 对嵌套哈希上的元素求和,ruby,hash,Ruby,Hash,我使用MongoDB存储聚合信息。类似于下面的散列,我们可以看到有多少客户按性别、年龄和地区进行分组(实际数据结构有5个级别): 生意人喜欢接触每一点信息。考虑到这一点,我正在尝试编写一个方法,该方法接收这样的散列,一个嵌套级别数组和他们想要查询的嵌套属性,以返回该类型的客户数量 示例:如果我们想要检索年轻客户的数量,样板应该是这样的: levels = %i(gender age region) young_custumers = sum_method(customers, levels, {

我使用MongoDB存储聚合信息。类似于下面的散列,我们可以看到有多少客户按性别、年龄和地区进行分组(实际数据结构有5个级别):

生意人喜欢接触每一点信息。考虑到这一点,我正在尝试编写一个方法,该方法接收这样的散列,一个嵌套级别数组和他们想要查询的嵌套属性,以返回该类型的客户数量

示例:如果我们想要检索年轻客户的数量,样板应该是这样的:

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