[英]How to nest an array of hashes with group by as json?
我有看起來像這樣的數據:
[
{date: '2014/10/01', group: 'a', node: '2'},
{date: '2014/10/01', group: 'b', node: '3'},
{date: '2014/10/02', group: 'a', node: '4'},
{date: '2014/10/02', group: 'b', node: '1'}
]
我將如何按日期先進行分組,如下所示:
.group_by{|x| [x.date.strftime("%Y-%m-%d")}
但是然后按group
,然后按node
並將其呈現為嵌套的json?
我正在尋找這樣的東西:
[
{'2014/10/01': {groups: [{a: ['2'], b: ['3']}]},
{'2014/10/02': {groups: [{a: ['4'], b: ['1']}]},
]
嘗試這個:
arr = [
{date: '2014/10/01', group: 'a', node: '2'},
{date: '2014/10/01', group: 'b', node: '3'},
{date: '2014/10/02', group: 'a', node: '4'},
{date: '2014/10/02', group: 'b', node: '1'}
]
arr.group_by { |item| item[:date] }.map do |k,v|
Hash[k, { groups: v.map { |g| Hash[g[:group], [g[:node]]] }}]
end
# => [{"2014/10/01"=>{:groups=>[{"a"=>["2"]}, {"b"=>["3"]}]}}, {"2014/10/02"=>{:groups=>[{"a"=>["4"]}, {"b"=>["1"]}]}}]
當遇到這樣的問題,涉及到數據的多次轉換時,我經常發現將問題分為兩個步驟很有用,第一步是創建一個包含所有基本信息的數組或哈希。 第二個是將數據格式化為所需的格式。
最好圍繞一個示例來描述該過程。 問題中給出的一個很好:
arr = [
{date: '2014/10/01', group: 'a', node: '2'},
{date: '2014/10/01', group: 'b', node: '3'},
{date: '2014/10/02', group: 'a', node: '4'},
{date: '2014/10/02', group: 'b', node: '1'}
]
由於我們將對日期進行分組,因此將數據從arr
提取到鍵為日期的哈希中是很有意義的。 這些鍵的值是散列,包含與arr
每個元素中的:group
和:node
值相對應的鍵值對。 我選擇使用Hash#update的形式(也稱為merge!
)來執行此操作,該形式使用一個塊來確定要合並的兩個哈希中存在的鍵的值:
h = arr.each_with_object({}) { |g,h|
h.update(g[:date]=>{ g[:group]=>g[:node] }) { |_,oh,nh|oh.update(nh) } }
#=> {"2014/10/01"=>{"a"=>"2", "b"=>"3"},
# "2014/10/02"=>{"a"=>"4", "b"=>"1"}}
在繼續進行格式化步驟之前,我應該指出,根據要求,在后續的計算中使用此哈希值可能比請求的數組更方便。
現在可以使用Enumerable#map進行格式化:
h.map { |d,g| { d=>{groups: [g] } } }
#=> [{"2014/10/01"=>{:groups=>[{"a"=>"2", "b"=>"3"}]}},
# {"2014/10/02"=>{:groups=>[{"a"=>"4", "b"=>"1"}]}}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.