簡體   English   中英

遍歷哈希數組以基於另一個哈希鍵求和一個哈希值的值

[英]Iterate over array of hashes to sum values of one hash value based on another hash key

我將以下散列數組作為輸入:

ar = [{"Sales"=>"11", "CustID"=>"Cust04"},
      {"Sales"=>"44.9", "CustID"=>"Cust04"},
      {"Sales"=>"79.17", "CustID"=>"Cust06"},
      {"Sales"=>"73.84", "CustID"=>"Cust06"},
      {"Sales"=>"34.9", "CustID"=>"Cust06"},
      {"Sales"=>"29.6825", "CustID"=>"Cust06"},
      {"Sales"=>"2048.7", "CustID"=>"Cust06"},
      {"Sales"=>"15.24", "CustID"=>"Cust02"},
      {"Sales"=>"54.874", "CustID"=>"Cust04"},
      {"Sales"=>"12.79", "CustID"=>"Cust08"},
      {"Sales"=>"22.65", "CustID"=>"Cust08"},
      {"Sales"=>"63.26", "CustID"=>"Cust08"},
      {"Sales"=>"16.207", "CustID"=>"Cust08"},
      {"Sales"=>"782.2", "CustID"=>"Cust07"},
      {"Sales"=>"215.45", "CustID"=>"Cust07"},
      {"Sales"=>"781.23", "CustID"=>"Cust07"},
      {"Sales"=>"370.14", "CustID"=>"Cust07"},
      {"Sales"=>"1.7", "CustID"=>"Cust09"},
      {"Sales"=>"22.405", "CustID"=>"Cust09"}
]

我正在尋找基於銷售總額的以下輸出,其排名為:

ar_out # =>
["Customer" => "Cust04", "TotalSales" => "xxxx", "Rank" => "1"]

你可以這樣嘗試

輸入

ar = [
  { "Sales" => "11", "CustID" => "Cust04" },
  { "Sales" => "44.9", "CustID" => "Cust04" },
  { "Sales" => "79.17", "CustID" => "Cust06" },
  { "Sales" => "73.84", "CustID" => "Cust06" },
  { "Sales" => "34.9", "CustID" => "Cust06" },
  { "Sales" => "29.6825", "CustID" => "Cust06" },
  { "Sales" => "2048.7", "CustID" => "Cust06" },
  { "Sales" => "15.24", "CustID" => "Cust02" },
  { "Sales" => "54.874", "CustID" => "Cust04" },
  { "Sales" => "12.79", "CustID" => "Cust08" },
  { "Sales" => "22.65", "CustID" => "Cust08" },
  { "Sales" => "63.26", "CustID" => "Cust08" },
  { "Sales" => "16.207", "CustID" => "Cust08" },
  { "Sales" => "782.2", "CustID" => "Cust07" },
  { "Sales" => "215.45", "CustID" => "Cust07" },
  { "Sales" => "781.23", "CustID" => "Cust07" },
  { "Sales" => "370.14", "CustID" => "Cust07" },
  { "Sales" => "1.7", "CustID" => "Cust09" },
  { "Sales" => "22.405", "CustID" => "Cust09" }
]

理線

ar.each_with_object(Hash.new(0)) { |hsh, e| e[hsh['CustID']] += hsh['Sales'].to_f }.
  sort_by { |_, v| -v }.
  map.with_index { |(k, v), i| [{ 'Customer' => k, 'TotalSales' => v, 'Rank' => i + 1 }] }

產量

[
  [
    {
      "Customer": "Cust06",
      "TotalSales": 2266.2925,
      "Rank": 1
    }
  ],
  [
    {
      "Customer": "Cust07",
      "TotalSales": 2149.02,
      "Rank": 2
    }
  ],
  [
    {
      "Customer": "Cust08",
      "TotalSales": 114.90699999999998,
      "Rank": 3
    }
  ],
  [
    {
      "Customer": "Cust04",
      "TotalSales": 110.774,
      "Rank": 4
    }
  ],
  [
    {
      "Customer": "Cust09",
      "TotalSales": 24.105,
      "Rank": 5
    }
  ],
  [
    {
      "Customer": "Cust02",
      "TotalSales": 15.24,
      "Rank": 6
    }
  ]
]
ar.
  each_with_object({}) do |hash, acc|
    (acc[hash["CustID"]] ||= {"Customer" => hash["CustID"], "TotalSales" => 0}).
      tap { |h| h["TotalSales"] += hash["Sales"].to_f }
  end.
  values.
  sort_by { |h| -h["TotalSales"] }.
  map.
  with_index(1) { |h, idx| h.merge("Rank" => idx) }

#⇒ [{"Customer"=>"Cust06", "TotalSales"=>2266.2925, "Rank"=>1},
#   {"Customer"=>"Cust07", "TotalSales"=>2149.02, "Rank"=>2},
#   {"Customer"=>"Cust08", "TotalSales"=>114.90699999999998, "Rank"=>3},
#   {"Customer"=>"Cust04", "TotalSales"=>110.774, "Rank"=>4},
#   {"Customer"=>"Cust09", "TotalSales"=>24.105, "Rank"=>5},
#   {"Customer"=>"Cust02", "TotalSales"=>15.24, "Rank"=>6}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM