Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何将GROUPBY作为json嵌套哈希数组?_Ruby On Rails_Ruby_Json - Fatal编程技术网

Ruby on rails 如何将GROUPBY作为json嵌套哈希数组?

Ruby on rails 如何将GROUPBY作为json嵌套哈希数组?,ruby-on-rails,ruby,json,Ruby On Rails,Ruby,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'} ] [ {'2014/10/01': {groups: [{a: ['2'], b: ['3']}]

我有如下数据:

[
  {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'}
]
[
  {'2014/10/01': {groups: [{a: ['2'], b: ['3']}]},
  {'2014/10/02': {groups: [{a: ['4'], b: ['1']}]},
]
我如何按照日期进行第一次分组,如下所示:

.group_by{|x| [x.date.strftime("%Y-%m-%d")}
然后按组,然后按节点,并将其作为嵌套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'}
]
[
  {'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.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的值相对应的键值对。我选择使用aka 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"}}
在转到格式化步骤之前,我应该指出,根据需要,在后续计算中使用此哈希可能比使用请求的数组更方便

现在,格式设置非常简单,可以使用:


当遇到这样的问题时,涉及到对数据的多次转换,我经常发现将问题分为两个步骤很有用,第一步是创建一个包含所有基本信息的数组或散列;第二种方法是将数据格式化为所需的格式

最好围绕一个例子来描述这个过程。问题中给出的答案很好:

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的值相对应的键值对。我选择使用aka 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"}}
在转到格式化步骤之前,我应该指出,根据需要,在后续计算中使用此哈希可能比使用请求的数组更方便

现在,格式设置非常简单,可以使用:


请发布预期的JSON结果。所需输出的第一个元素是:{:2014/10/01=>{:groups=>[{:a=>[2],:b=>[3]}}。您是否打算将日期字符串转换为符号?如果不是,则替换为=>。另外,为什么希望组的值是包含单个哈希的数组,而不仅仅是哈希?请发布预期的结果JSON。所需输出的第一个元素是:{:2014/10/01=>{:groups=>[{:a=>[2],:b=>[3]}}}。您是否打算将日期字符串转换为符号?如果不是,则替换为=>。另外,为什么您希望组的值是一个包含单个哈希的数组,而不仅仅是哈希?OP要求将组存储为数组:哈希[g[:组],*g[:节点]]。Joseph说他想要[{a:['2'],b:['3']}],即一个包含单个元素的数组,一个哈希,而不是哈希数组。他还要求将日期转换为符号。更改答案以满足这些要求并不困难,但我认为您不应该这样做。考虑到他给了你一个greenie,你的答案似乎更好地反映了他想要什么,而不是他说想要什么。OP要求将组存储为数组:散列[g[:group],*g[:node]]。约瑟夫说他想要[{a:['2',b:['3']}],即,一个包含单个元素的数组,散列,而不是散列数组。他还要求将日期转换为符号。更改答案以满足这些要求并不困难,但我认为您不应该这样做。考虑到他给了你绿皮书,看来你的答案更能反映他想要什么,而不是他说他想要什么。