2015-02-05 3 views
-1

Я создал хэш, который имеет массив как значение.Добавить значения массива внутри хеша

{ 
    "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] 
} 

Я не знаю, как это исходит. Любые указатели благодарны.

+1

Вашего хэша синтаксис является недопустимым, используйте '=> 'вместо': ' – Stefan

+0

это вывод, который я показываю после использования to_json, поэтому он преобразуется в форму json – user3290805

+1

@Stefan Теперь это не так. – sawa

ответ

3

Я бы сделать что-то вроде этого:

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

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

Пока это единственный ответ, который получил правильные значения, но ваши ключи не являются тем, что имеет OP. Подсказка: Ruby 2.2, https://bugs.ruby-lang.org/issues/4935. – sawa

+0

это в настоящее время возвращает '[[28], [14], []]' – Stefan

+1

@spickermann не могли бы вы уточнить '{| _, v | Array (v.reduce (: +))} 'code? или любую хорошую ссылку, чтобы я мог понять. – VKatz

0

Для 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]} 
+0

Ваш хэш отличается от того, который имеет один ОП в вопросе, и тот, который представлен в комментарии. – sawa

+0

Даже если ключевое различие игнорируется, это неверно. Подсказка: 'hash [" 7 "]'. Однако это можно исправить. Подсказка: «начальное значение», «splat». – sawa

0

Классический пример для отображения/уменьшения. Вам нужно итерацию по хэш-ключей и значений (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} 
+1

Ваше использование 'flatten' и' * 'не требуется. – sawa

+0

Это неверно. Подсказка: 'h [7]'. Однако это можно исправить. Подсказка: «начальное значение», «splat». – sawa

+0

Вы правы, сгладить не нужно. Исправлено: – Grych

0

Если строка так же, как вы упомянули, вы можете разобрать его с помощью JSON, или перейти на этот шаг, если у вас уже есть хэш. Вы можете проверить документацию нагнетающего 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} 
+0

OP не сказал, что это JSON. OP мог фактически иметь дело с JSON, но поскольку OP не упоминал об этом, вы должны предположить, что представили OP. Подсказка: Ruby 2.2. – sawa

+0

И результат, который у вас есть, ближе к ожидаемому результату, чем два других ответа, опубликованных в некотором смысле, но это далеко в другом смысле. – sawa

+1

@sawa Если я не ошибаюсь, тогда формат данных Json Right? – VKatz

Смежные вопросы