Как создать новую хеш-таблицу, если у меня есть один большой хеш - PullRequest
0 голосов
/ 13 мая 2018

У меня есть массив хэшей:

{hashed_data = [
  {:name => "frontend", :session_total => 145, :byte => 54667},
  {:name => "backend_stagging", :session_total => 546, :byte => 895747},
  {:name => "backend", :session_total => 5468, :byte => 8957447},
  {:name => "frontend", :session_total => 54, :byte => 67387}
] 

Я должен создать следующий хэш.Его не нужно сортировать.

hashed_data_modify = {
  :frontend => {
    :name => "frontend",
    :summary => {:session_total => 546, :byte => 54667}
    :backend => {
      :name => "backend",
      :details => {:session_total => 5468, :byte => 8957447},
      :summary => { :name => "backend_stagging", :session_total => 546, :byte => 895747 }
    }

, то есть создайте новый ключ: frontend где hashed_data[:name] == "frontend" и создайте ключ: backend где hashed_data[:name] == "backend".Клавиша frontend содержит только данные для данных frontend, а для backend только backend.

Я попробовал свой sorting_method, это плохо:

hashed_data.select do |h|  
  if (h[:name] == "frontend") then
    return hash = {
      :frontend => {
        :name => hashed_data[:name],
        :details => [:session_total => hashed_data[:stot], :byte_in => hashed_data[:bin]]
      }
    } # :name => "frontend" etc.
    (h[:name == "backend")     
    return hash = {
      :backend => {:name => hashed_data[:name] #:name => "backend"}
    } etc.
  end
end

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 13 мая 2018

Полагаю, это то, что вы хотите.

hashed_data.group_by { |h| h[:name] }.
            map { |_,v| v.max_by { |g| g[:session_total] } }
  #=> [{:name=>"frontend", :session_total=>145, :byte=>54667},
  #    {:name=>"backend_stagging", :session_total=>546, :byte=>895747},
  #    {:name=>"backend", :session_total=>5468, :byte=>8957447}]

Обратите внимание, что первое вычисление выглядит следующим образом.

hashed_data.group_by { |h| h[:name] }
  #=> {"frontend"=>[{:name=>"frontend", :session_total=>145, :byte=>54667},
  #                 {:name=>"frontend", :session_total=>54, :byte=>67387}],
  #    "backend_stagging"=>[{:name=>"backend_stagging", :session_total=>546,
  #                          :byte=>895747}],
  #    "backend"=>[{:name=>"backend", :session_total=>5468, :byte=>8957447}]}

Во-первых, вы говорите, что хотите первый элементмассив возвращается:

{:name=>"frontend", :session_total=>546, :byte=>54667}

Я предполагаю, что значение :session_total является опечаткой, и должно быть 145.

Во-вторых, я предполагаю, что когда два или более хэшей имеют одинаковое значение :name (здесь просто "frontend"), вы хотите оставить тот, для которого значение session_total является наибольшим (но этодействительно дикое предположение).

В-третьих, вы, кажется, хотите изменить значение "backend_staging" на ключ :summary.Если это так, это не главное в вопросе, а просто неудобство для тех, кто дает ответы, поэтому я проигнорировал это требование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...