Если у вас есть массив, как вы упомянули в этой структуре:
array = [
{"points": 0, "block": 3},
{"points": 25, "block": 8},
{"points": 65, "block": 4}
]
Вы можете использовать следующий код для достижения своей цели:
result = {
points: array.map{ |item| item[:points] }.inject(:+),
block: array.map{ |item| item[:block] }.inject(:+)
}
Вы получите этот результат:
{:points=>90, :block=>15}
Примечание : Это будет повторять дважды по массиву. Я пытаюсь найти лучший способ итерации один раз, и при этом все еще иметь такой же элегантный / легкий для готовости код.
Если вы хотите сделать это более обобщенно (больше ключей, чем :points
и :block
), то вы можете использовать этот код:
array = [
{"points": 0, "block": 3},
{"points": 25, "block": 8},
{"points": 65, "block": 4}
]
keys = [:points, :block] # or you can make it generic with array.first.keys
result = keys.map do |key|
[key, array.map{ |item| item.fetch(key, 0) }.inject(:+)]
end.to_h