2015-10-30 2 views
1

У меня есть Hash, что индексы кучу идентификаторов до значения, что-то вроде:перебрать хэша, используя ключи из массива, и суммировать результаты

hash = {1: 3.00, 2: 4.00, 3: 2.00, 4: 15.00, 5: 12.00, 6: 1.00} 

У меня есть массив, который выглядит как:

arr = [2, 3, 6] 

Что такое короткий, рубидный идиоматический способ перебора моего массива и суммировать совокупную сумму из соответствующих ключей в Hash?

Результат выше будет равна:

4.00 + 2.00 + 1.00 == 7.00 
+1

Этот вопрос был отправлен более трех недель назад. Интересно, что никто не указал, что 'hash' не является допустимым объектом. Синтаксис '{1: 2}' является сокращением для '{: 1 => 2}', но символ не может начинаться с цифры. '{" 1 ": 2}' будет в порядке, но я подозреваю, что вы имеете в виду '(1 => 2}'. Также нет смысла записывать значения (поплавки) с двумя или более цифрами после десятичного с последним один из которых равен нулю, так как Ruby отбросит окончательный нуль. –

ответ

9

Вы, вероятно, не может получить больше рубиново-иш, чем это :)

hash.values_at(*arr).reduce(:+) 
+0

Them's fightin ' слова. –

0
arr.map {|i| hash[i]}.reduce(:+) 
+1

Хотя этот ответ, вероятно, правильный и полезный, предпочтительно, если вы [включите некоторое объяснение вместе с ним] (http://meta.stackexchange.com/q/114762/159034), чтобы объяснить, как это помогает решить проблему.Это становится особенно полезным в будущем, если есть изменения (возможно, не связанные), которые заставляют его прекратить работу, и пользователи должны понять, как это когда-то работало. –

1
hash = {1=>3.0, 2=>4.0, 3=>2.0, 4=>15.0, 5=>12.0, 6=>1.0} 
arr = [2, 3, 6] 

arr.reduce(0) { |t,e| t + hash[e] } 
    #=> 7.0 
+0

Я утверждаю, что мой путь более рубиновый. Вероятно, вы более результативны, но не так сексуальны. :) –

+0

Мы можем согласиться. См. Мой комментарий к вопросу. –

+0

О, черт, никогда не замечал странных ключей. –

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