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']}],即,一个包含单个元素的数组,散列,而不是散列数组。他还要求将日期转换为符号。更改答案以满足这些要求并不困难,但我认为您不应该这样做。考虑到他给了你绿皮书,看来你的答案更能反映他想要什么,而不是他说他想要什么。