在散列中添加数组的值

Add values of an array inside a hash

我创建了一个以数组作为值的散列。

{
  "0":[0,14,0,14],
  "1":[0,14],
  "2":[0,11,0,12],
  "3":[0,11,0,12],
  "4":[0,10,0,13,0,11],
  "5":[0,10,0,14,0,0,0,11,12,0],
  "6":[0,0,12],
  "7":[],
  "8":[0,14,0,12],
  "9":[0,14,0,0,11,14],
  "10":[0,11,0,12],
  "11":[0,13,0,14]
}

我想要每个数组中所有值的总和。我希望有这样的输出:

{
  "0":[24],
  "1":[14],
  "2":[23],
  "3":[23],
  "4":[34],
  "5":[47],
  "6":[12],
  "7":[],
  "8":[26],
  "9":[39],
  "10":[23],
  "11":[27]
}

我不知道如何从这里开始。不胜感激。

为了hash反对你这个。

hash = {"0"=>[0,14,0,14],"1"=>[0,14],"2"=>[0,11,0,12],"3"=>[0,11,0,12],"4"=>[0,10,0,13,0,11],"5"=>[0,10,0,14,0,0,0,11,12,0],"6"=>[0,0,12],"7"=>[],"8"=>[0,14,0,12],"9"=>[0,14,0,0,11,14],"10"=>[0,11,0,12],"11"=>[0,13,0,14]}

您可以更改每个 k => v 对的值

hash.each_pair do |k, v|
  hash[k] = [v.reduce(0, :+)]
end

将在

解决
hash = {"0"=>[28], "1"=>[14], "2"=>[23], "3"=>[23], "4"=>[34], "5"=>[47], "6"=>[12], "7"=>[0], "8"=>[26], "9"=>[39], "10"=>[23], "11"=>[27]} 

map/reduce 的经典示例。您需要迭代散列键和值 (map {|k,v|}),并使用 reduce(0) {|acc, x| acc+x}

对每个值计算总和
h = {1 => [1,2,3], 2 => [3,4,5], 7 => []} #example
a = h.map {|k,v| [k ,v.reduce(0) {|acc, x| acc+x}] }
=> [[1, 6], [2, 12], [7, 0]]
Hash[a]
=> {1=>6, 2=>12, 7=>0}

如果您的字符串与您提到的一样,您可以使用 JSON 解析它,或者如果您已经有一个哈希,则跳过该步骤。 您可以查看 inject here

的文档
require 'json'
json_string =  '
{
  "0":[0,14,0,14],
  "1":[0,14],
  "2":[0,11,0,12],
  "3":[0,11,0,12],
  "4":[0,10,0,13,0,11],
  "5":[0,10,0,14,0,0,0,11,12,0],
  "6":[0,0,12],
  "7":[],
  "8":[0,14,0,12],
  "9":[0,14,0,0,11,14],
  "10":[0,11,0,12],
  "11":[0,13,0,14]
}
'
hash = JSON.parse json_string

result = Hash.new

hash.each do |key, value|

  result[key] = value.inject(:+)

end

puts result.inspect

结果:

{"0"=>28, "1"=>14, "2"=>23, "3"=>23, "4"=>34, "5"=>47, "6"=>12, "7"=>nil, "8"=>26, "9"=>39, "10"=>23, "11"=>27}

我会这样做:

hash = { "0" => [0,14,0,14], "1" => [0,14], "7" => [] }

hash.each { |k, v| hash[k] = Array(v.reduce(:+)) }
# => { "0" => [28], "1" => [14], "7" => [] }