如果我有一个大哈希,如何创建一个新的哈希表

时间:2018-05-13 06:24:46

标签: arrays ruby hash

我有一系列哈希:

{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 :(得分:3)

我猜这是你想要的。

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。如果是这样,这不是问题的核心,只是对那些给出答案的人造成麻烦,所以我忽视了这个要求。