计算重复值ruby哈希

-3 ruby arrays hash

我的输入数据:

[
  {"discount_code"=>"LAKR", "affiliate_name"=>"Jasbir Singh"},
  {"discount_code"=>"LAKR", "affiliate_name"=>"Jasbir Singh"}, 
  {"discount_code"=>"LAKR", "affiliate_name"=>"Jasbir Singh"}, 
  {"discount_code"=>"LAKR", "affiliate_name"=>"Jasbir Singh"},  
  {"discount_code"=>"LAKR", "affiliate_name"=>"Jasbir Singh"}, 
  {"discount_code"=>"LAKR", "affiliate_name"=>"Jasbir Singh"}, 
  {"discount_code"=>"4567", "affiliate_name"=>"an"}, 
  {"discount_code"=>"LAKR", "affiliate_name"=>"Jasbir Singh"}
]
Run Code Online (Sandbox Code Playgroud)

我想将其转换为:

[
  {"discount_code"=>"LAKR", "count"=>7, "affiliate_name"=>"Jasbir Singh"},
  {"discount_code"=>"4567", "count"=>1, "affiliate_name"=>"Jasbir Singh"}
]
Run Code Online (Sandbox Code Playgroud)

这具有输入数据,其具有其出现次数的计数,并且没有重复值.

Car*_*and 6

如果arr是你的数组:

arr.group_by(&:itself).map { |h,v| h.merge("count"=>v.size) }
  #=> [{"discount_code"=>"LAKR", "count"=>7, "affiliate_name"=>"Jasbir Singh"},
  #    {"discount_code"=>"4567", "count"=>1, "affiliate_name"=>"Jasbir Singh"}]
Run Code Online (Sandbox Code Playgroud)

步骤:

h = arr.group_by(&:itself)
  #=> {{"discount_code"=>"LAKR", "affiliate_name"=>"Jasbir Singh"}=>
  #      [{"discount_code"=>"LAKR", "affiliate_name"=>"Jasbir Singh"},
  #       {"discount_code"=>"LAKR", "affiliate_name"=>"Jasbir Singh"},
  #       {"discount_code"=>"LAKR", "affiliate_name"=>"Jasbir Singh"},
  #       {"discount_code"=>"LAKR", "affiliate_name"=>"Jasbir Singh"},
  #       {"discount_code"=>"LAKR", "affiliate_name"=>"Jasbir Singh"},
  #       {"discount_code"=>"LAKR", "affiliate_name"=>"Jasbir Singh"},
  #       {"discount_code"=>"LAKR", "affiliate_name"=>"Jasbir Singh"}],
  #    {"discount_code"=>"4567", "affiliate_name"=>"an"}=>
  #      [{"discount_code"=>"4567", "affiliate_name"=>"an"}]}
enum = h.map
  #=> #<Enumerator: {
  #    {"discount_code"=>"LAKR", "affiliate_name"=>"Jasbir Singh"}=>
  #      [{"discount_code"=>"LAKR", "affiliate_name"=>"Jasbir Singh"},
  #       ...
  #       {"discount_code"=>"LAKR", "affiliate_name"=>"Jasbir Singh"}],
  #    {"discount_code"=>"4567", "affiliate_name"=>"an"}=>
  #      [{"discount_code"=>"4567", "affiliate_name"=>"an"}]}:map>
enum.each { |h,v| h.merge("count"=>v.size) }
  #=> [{"discount_code"=>"LAKR", "affiliate_name"=>"Jasbir Singh", "count"=>7},
  #    {"discount_code"=>"4567", "affiliate_name"=>"an", "count"=>1}]
Run Code Online (Sandbox Code Playgroud)

第一个元素enum传递给块并分配给块变量:

h,v = enum.next
  #=> [{"discount_code"=>"LAKR", "affiliate_name"=>"Jasbir Singh"},
  #    ...
  #    {"discount_code"=>"LAKR", "affiliate_name"=>"Jasbir Singh"}]]

h #=> {"discount_code"=>"LAKR", "affiliate_name"=>"Jasbir Singh"} 
v #=> [{"discount_code"=>"LAKR", "affiliate_name"=>"Jasbir Singh"},
  #    ...
  #    {"discount_code"=>"LAKR", "affiliate_name"=>"Jasbir Singh"}] 
Run Code Online (Sandbox Code Playgroud)

并执行块计算:

h.merge("count"=>v.size)
  #=> h.merge("count"=>7)
  #=> {"discount_code"=>"LAKR", "affiliate_name"=>"Jasbir Singh", "count"=>7} 
Run Code Online (Sandbox Code Playgroud)

剩下的计算是类似的.