Ruby合并哈希值
我编写了一个API来组织我的日常用户数据。
原始格式就像
"dau": { "2017-05-02": 1, "2017-05-04": 2, "2017-05-05": 2, } "new_user": { "2017-05-02": 1, "2017-05-04": 0, "2017-05-07": 0, }
很难在HTML表格中逐行显示。
因此,我希望格式成为这个格式。
但是,我不知道如何处理。
info: { "2017-05-02": { dau: 1, new_user: 1 }, "2017-05-04": { dau: 2, new_user: 0 }, "2017-05-05": { dau: 2 }, "2017-05-07": { new_user: 0 } }
假设你有data
,那么
(data['dau'].keys + data['new_user'].keys).uniq.map { |k| [k, { dau: data['dau'][k].to_i, new_user: data['new_user'][k].to_i } ] }.to_h
如果您不想要默认值/ 0值,
(data['dau'].keys + data['new_user'].keys).uniq.map { |k| [k, { dau: data['dau'][k], new_user: data['new_user'][k] }.compact ] }.to_h
输出:
{ "2017-05-02" => { :dau => 1, :new_user => 1 }, "2017-05-04" => { :dau => 2, :new_user => 0 }, "2017-05-05" => { :dau => 2 }, "2017-05-07" => { :new_user => 0 } }
希望能帮助到你..
keys = (dau.keys + new_user.keys).uniq # [:"2017-05-02", :"2017-05-04", :"2017-05-05", :"2017-05-07"] keys.each_with_object({}) do |key, result| result[key] = {dau: dau[key], new_user: new_user[key] }.compact end # {:"2017-05-02"=>{:dau=>1, :new_user=>1}, # :"2017-05-04"=>{:dau=>2, :new_user=>0}, # :"2017-05-05"=>{:dau=>2}, # :"2017-05-07"=>{:new_user=>0}}
这是each_with_object
的替代方案。 它应该适用于任意数量的键:
data = {"dau": { "2017-05-02": 1, "2017-05-04": 2, "2017-05-05": 2 }, "new_user": { "2017-05-02": 1, "2017-05-04": 0, "2017-05-07": 0 } } info = Hash.new { |h, k| h[k] = {} } info = data.each_with_object(info) do |(key, sub_h), h| sub_h.each do |date, i| h[date][key] = i end end p info # {:"2017-05-02"=>{:dau=>1, :new_user=>1}, :"2017-05-04"=>{:dau=>2, :new_user=>0}, :"2017-05-05"=>{:dau=>2}, :"2017-05-07"=>{:new_user=>0}}