2015-05-07 6 views
0

Скажем, у меня есть этот массивКак суммировать определенные значения в двумерном массиве

arr = [["Ready", 6], ["Draft", 3], ["To Repair", 4], ["Closed", 2]] 

Моя цель состоит в том, чтобы показать эти данные в процентах, а не абсолютных значений. Вот что я хочу получить:

[["Ready", 0.5], ["Draft", 0.2], ["To Repair", 0.3], ["Closed", 0.2]] 

Это означает, что мне нужно сначала получить сумму. То, что я пытался сделать, это:

arr.inject {|sum, a| sum + a[1]} 

но это возвращает TypeError Exception: no implicit conversion of Fixnum into Array. Какие-либо предложения?

ответ

1

a[0] - это строка; вы хотите a[1]. И начиная с sum = 0 и не из sum = ["Ready, 6] хорошо - так что вам нужен параметр для inject:

sum = arr.inject(0) { |sum, a| sum + a[1] }.to_f 
arr.each { |el| el[1] /= sum } 
# => [["Ready", 0.4], ["Draft", 0.2], ["To Repair", 0.26666666666666666], ["Closed", 0.13333333333333333]] 
+0

Ok! a [0] был просто опечаткой, но инъекция (0) - хорошая точка, спасибо! я не понял, как работает инъекция –

1

Если вы хотите добавить цифры, вы должны получить доступ к элементу по индексу 1 и предоставить начальное значение для суммы.

arr.inject(0) {|sum, a| sum + a[1]} 
# => 15 
1

Ленивый (но не самый effieicnt) способ:

arr.map(&:last).inject(:+) 
Смежные вопросы