2015-02-12 3 views
0

Имея массив:Рубин на Rails - получить максимальную и сумму группы по несколько ключей в массиве одновременно

[ { 'a' => 1, 'b' => 1, 'c' => 1, 'd' => 1, 'e' => 2}, 
    { 'a' => 1, 'b' => 1, 'c' => 2, 'd' => 1, 'e' => 2}, 
    { 'a' => 1, 'b' => 1, 'c' => 3, 'd' => 1, 'e' => 2}, 
    { 'a' => 1, 'b' => 2, 'c' => 4, 'd' => 2, 'e' => 2 }, 
    { 'a' => 1, 'b' => 2, 'c' => 5, 'd' => 2, 'e' => 2 }, 
    { 'a' => 2, 'b' => 1, 'c' => 6, 'd' => 3, 'e' => 2 }, 
    { 'a' => 2, 'b' => 1, 'c' => 7, 'd' => 3, 'e' => 2 }, 
    { 'a' => 2, 'b' => 1, 'c' => 8, 'd' => 3, 'e' => 2 }, 
    { 'a' => 2, 'b' => 2, 'c' => 9, 'd' => 4, 'e' => 2 }, 
    { 'a' => 2, 'b' => 2, 'c' => 10, 'd' => 4, 'e' => 2 } ] 

Я хочу, чтобы получить максимум от «с», сумма «D», сумма «е» сгруппированных по 'a' и 'b'.

Таким образом, результат должен быть:

[ { 'a' => 1, 'b' => 1, 'c' => 3, 'd' => 3, 'e' => 6}, 
    { 'a' => 1, 'b' => 2, 'c' => 5, 'd' => 4, 'e' => 4}, 
    { 'a' => 2, 'b' => 1, 'c' => 8, 'd' => 9, 'e' => 6}, 
    { 'a' => 2, 'b' => 2, 'c' => 10, 'd' => 8, 'e' => 4} ] 

До сих пор я следую How to find max value grouped by multiple keys in array of hashes?, используя этот код, чтобы получить максимум из каждой группы

a.group_by { |h| h.values_at("a", "b") }.map { |_, v| v.max_by { |h| h["c"] } } 

Пожалуйста, руководство меня, получить сумму тоже. Большое спасибо.

P/s: с помощью Ruby, Rails 1.8.7 и 2.3.5

+0

Если мой вопрос дублируется, может ли он дать мне тот же самый? Спасибо – Anh

ответ

1

Это работает:

a.group_by { |h| h.values_at("a", "b") }.map do |_, v| 
    v.inject { |c, h| c.merge({ "c" => [c["c"], h["c"]].max, 
           "d" => c["d"] + h["d"], 
           "e" => c["e"] + h["e"] }) } 
end 
+0

Макс, спасибо. Но как насчет суммы «е»? – Anh

+1

Ань - вы могли бы просто дублировать последний кран; например: a.group_by {| h | h.values_at ("a", "b")} .map {| _, v | v.max_by {| h | h ["c"]} .tap {| h | h ["d"] = v.inject (0) {| sum, h | sum + h ["d"]}} .tap {| h | h ["e"] = v.inject (0) {| sum, h | sum + h ["e"]}}} Отредактировал мой комментарий о версиях - думаю, что я ошибся. – Jonathan

+0

Джонатан, работая отлично в моем env. Коснитесь параметра, определенного в 1.8.7. Однако синтаксис может быть для новичков, как я. Не могли бы вы расширить его до более удобного формата? Спасибо всем вам. – Anh

1

Как вы просили в комментариях, вот мой комментарий продлен в более простой форме. Мое редактирование сообщения Макса было отклонено.

a.group_by { |h| h.values_at("a", "b") }. 
    map { |_, v| v.max_by { |h| h["c"] }. 
    tap { |h| h["d"] = v.inject(0) { |sum, h| sum + h["d"] } }. 
    tap { |h| h["e"] = v.inject(0) { |sum, h| sum + h["e"] } } } 
+0

Джонатан, требуется больше: получите максимум от дополнительных клавиш («f») (макс. «C» и «f»). Пожалуйста, научите меня, как это сделать. – Anh

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