我有一个哈希:
hash = {"0"=>{"0"=>"148", "1"=>"2", "2"=>"90", ....}, "1"=>{"0"=>10}, .....}
我想添加所有深层嵌套的值。总结其所有价值的最佳和最佳方法是什么?
我尝试这样做:
hash.values.inject(0){|m,n| m + n.values.map(&:to_i).sum}
答案 0 :(得分:2)
求解任意深度与求解固定深度没有太大差别:直接应用递归。如果当前值是一个哈希值,那么将它加总并将其加到总数中,如果没有添加值本身。
def hash_sum(h)
h.values.inject(0) do |total, value|
case value
when Hash then total + hash_sum(value)
else
total + value.to_i
end
end
end
答案 1 :(得分:1)
从评论和示例中,我假设所有相关值都在深度2处。
hash = {"0"=>{"0"=>"148", "1"=>"2", "2"=>"90"}, "1"=>{"0"=>10}}
hash.values.flat_map(&:values).map(&:to_i).inject(:+)
# => 250
如果您拥有深度为3的所有值,则添加另一个flat_map(&:values)
:
hash = {"3" => {"0"=>{"0"=>"148", "1"=>"2", "2"=>"90"}, "1"=>{"0"=>10}}, "4" => {"0"=> {"1" => "6"}}}
hash.values.flat_map(&:values).flat_map(&:values).map(&:to_i).inject(:+)
# => 256
答案 2 :(得分:0)
最多两级嵌套(从您的解决方案派生):
hash = {"0"=>{"0"=>"148", "1"=>"2", "2"=>"90"}, "1"=>{"0"=>10}}
hash.values.inject(0) { |m, n|
Hash === n ? m + n.values.map(&:to_i).reduce(&:+) : m + n.to_i
}
#⇒ 250
无限嵌套解决方案:
def sum_deeply(h)
h.values.inject(0) { |m, v|
m + (Hash === v ? sum_deeply(v) : v.to_i)
}
end
sum_deeply(hash)
#⇒ 250
希望它有所帮助。
答案 3 :(得分:0)
这是一种递归方法,它是弗雷德里克的一种变体:
def deep_hash(obj)
return obj.to_i unless obj.is_a? Hash
obj.reduce(0) { |t,(_,v)| t + deep_hash(v) }
end
hash = { "0"=>{ "0"=>"148, "1"=>"2", "2"=>"90" },
"1"=>{ "0"=>10, "1"=>{ "0"=>16 } } }
deep_hash(hash)
#=> 266