簡體   English   中英

如何使用group by作為JSON嵌套哈希數組?

[英]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.

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