2016-01-30 6 views
1

Я работаю с данными диаграммы. У меня три набора данных из трех источников, и я пытаюсь добавить их вместе в год в новый. В моем примере, года являются 0, 1, 2.Добавление значений многомерного массива

визуальными:

data = [[[year, value], [year, value], [year, value]], 
     [[year, value], [year, value], [year, value]], 
     [[year, value], [year, value], [year, value]]] 

Вот пример с фактическими данными:

data = [[[0, 1], [1, 2], [2, 3]], 
     [[0, 4], [1, 5], [2, 6]], 
     [[0, 7], [1, 8], [2, 9]]] 

Я пытаюсь получить следующий результат :

data = [[0, 12], [1, 15], [2, 18]] 

чтобы добавить сложности, это не всегда будет три набора данных, это может быть один набор или двенадцать комплектов, любое количество.

Любая помощь очень ценится.

+0

показать нам код, который вы пытались – Gavriel

ответ

4

Решение:

data.map(&:to_h).reduce({}) {|memo, h| memo.merge(h) {|_,v1,v2| v1 + v2} }.to_a 

Пояснение:

Шаг 1: Преобразование массива данных в массив хешей

data_hash = data.map(&:to_h) 
#=> [{0=>1, 1=>2, 2=>3}, {0=>4, 1=>5, 2=>6}, {0=>7, 1=>8, 2=>9}] 

Шаг 2: Сокращение массива хэша путем слияния ea ch hash друг с другом, при этом обеспечивая добавление значений для данного ключа.

reduced_hash = data_hash.reduce({}) {|memo, h| memo.merge(h) {|_,v1,v2| v1 + v2} } 
#=> {0=>12, 1=>15, 2=>18} 

Мы используем пустой хэш {} в качестве начального значения memo, и объединить каждый хэш, присутствующий в data_hash массиве с ним - блок для merge будет гарантировать, что, когда ключ находится в процессе слияния, его значения складываются таким образом, что в конце концов, мы в конечном итоге сумма всех значений этого ключа

Шаг 3: Используйте to_a на хэш, чтобы получить результирующий массив

reduced_hash.to_a 
#=> [[0, 12], [1, 15], [2, 18]] 
+0

Большое спасибо за объяснение. – jBeas

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