散列数组,如何统计 'webpages' 具有最独特 'page' 视图的列表?

Array of hashes, how to count the list of 'webpages' with most unique 'page' views?

我试图按顺序显示最独特的页面浏览量,但不确定如何显示。我有数据变量:

data = [{"help_page/1"=>"126.318.035.038"},
 {"contact"=>"184.123.665.067"},
 {"home"=>"184.123.665.067"},
 {"about/2"=>"444.701.448.104"},
 {"help_page/1"=>"929.398.951.889"},
 {"index"=>"444.701.448.104"},
 {"help_page/1"=>"722.247.931.582"},
 {"about"=>"061.945.150.735"},
 {"help_page/1"=>"646.865.545.408"},
 {"home"=>"235.313.352.950"},
 {"help_page/1"=>"543.910.244.929"},
 {"home"=>"316.433.849.805"},
 {"contact"=>"543.910.244.929"}]

我试过这样的事情:

data.sort_by {|k, v| -v.uniq.count}.collect{|k, v| "#{k}\t#{v.uniq.count} #{'unique views', v.uniq.count}"}

我正在尝试获得类似于以下内容的结果:

/help_page/1    XX unique views
/contact    XX unique views
/home   XX unique views
/index  XX unique views
/about/2    XX unique views
/about  XX unique views

但没有成功。

Enumerable#group_by 是你的朋友,下面的一切都只是格式化输出。

data.group_by do |h|
  h.to_a.first.first
end.map do |k, v|
  [k, v.count]
end.sort_by(&:last).reverse.to_h
#⇒ {"help_page/1"=>5,
#   "home"=>3,
#   "contact"=>2,
#   "about"=>1,
#   "index"=>1,
#   "about/2"=>1}

我们可以使用 v2.7 中新增的方法 Enumerable#tally

data.map { |h| h.keys.first }.
     tally.
     sort_by { |_,count| -count }.
     each { |k,v| puts "#{k}   #{v} unique views" }

显示:

help_page/1   5 unique views
home   3 unique views
contact   2 unique views
about   1 unique views
index   1 unique views
about/2   1 unique views

步骤如下

a = data.map { |h| h.keys.first }
  #=> ["help_page/1", "contact", "home", "about/2", "help_page/1",
  #    "index", "help_page/1", "about", "help_page/1", "home",
  #    "help_page/1", "home", "contact"] 
b = a.tally
  #=> {"help_page/1"=>5, "contact"=>2, "home"=>3, "about/2"=>1,
  #    "index"=>1, "about"=>1} 
c = b.sort_by { |_,count| -count }
  #=> [["help_page/1", 5], ["home", 3], ["contact", 2], ["about", 1],
  #    ["index", 1], ["about/2", 1]]
c.each { |k,v| puts "#{k}   #{v} unique views" }
  #=> <displays the results shown above>