Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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数组的多分组_Ruby_Hash - Fatal编程技术网

Ruby数组的多分组

Ruby数组的多分组,ruby,hash,Ruby,Hash,我有这样一个数组: [{:a=>"2017-01-01", :b=>"2", :c=>"1"}, {:a=>"2017-01-01", :b=>"2", :c=>"2"}, {:a=>"2017-01-02", :b=>"5", :c=>"1"}] 例如,如果我使用键“:a”对数组进行分组,结果是: p = y.group_by { |g| g[:a]} => {"2017-01-01"=>[{:a=>"2017-01

我有这样一个数组:

[{:a=>"2017-01-01", :b=>"2", :c=>"1"}, {:a=>"2017-01-01", :b=>"2", :c=>"2"}, {:a=>"2017-01-02", :b=>"5", :c=>"1"}]
例如,如果我使用键“:a”对数组进行分组,结果是:

p = y.group_by { |g| g[:a]}

 => {"2017-01-01"=>[{:a=>"2017-01-01", :b=>"2", :c=>"1"}, {:a=>"2017-01-01", :b=>"2", :c=>"2"}], "2017-01-02"=>[{:a=>"2017-01-02", :b=>"5", :c=>"1"}]} 
现在我想为每个“:a”键“:b”分组,如:

我该怎么办?提前谢谢

编辑

多组由。。。1°组由a组成,2°组由b组成,结果为1°,等等

y.group_by {|g| g[:a]}.map do |k,v|
 [
  k, v.group_by { |d| d[:b] }.map do |p,q|
   [p, q.group_by { |f| f[:c] }]
  end.to_h
 ]
end.to_h  

使用上面的代码快速回答:

y = [{:a=>"2017-01-01", :b=>"2", :c=>"1"}, {:a=>"2017-01-01", :b=>"2", :c=>"2"}, {:a=>"2017-01-02", :b=>"5", :c=>"1"}]
p = y.group_by { |g| g[:a]}
q = p.map {|date, list| [date, list.group_by {|g| g[:b]}]}.to_h
这将产生以下预期结果:

q == {
  "2017-01-01" => {
    "2"=> [
      {:a=>"2017-01-01", :b=>"2", :c=>"1"},
      {:a=>"2017-01-01", :b=>"2", :c=>"2"}
    ]
  },
  "2017-01-02" => {
    "5"=> [
      {:a=>"2017-01-02", :b=>"5", :c=>"1"}
    ]
  }
}
如果您使用的是a,则可以使用以下方法稍微简化将散列映射到数组列表,然后将其转换回散列(使用
到_h
)的这种稍有奇怪的模式:


尽管如此,像这样操作复杂的嵌套哈希对象通常被认为是不好的做法。如果你的代码太复杂,你可能会考虑重新设计它是如何工作的,以一种更面向对象的方式。

< P>我认为,一些可能的解决方案是:

 y = [
  {
    :a=>"2017-01-01", 
    :b=>"2", 
    :c=>"1"
  }, 
  {
    :a=>"2017-01-01", 
    :b=>"2", 
    :c=>"2"
  }, 
  {
    :a=>"2017-01-02", 
    :b=>"5", 
    :c=>"1"
  }
]
第一:

y.group_by { |g| [g[:a], g[:b]] }
但结果似乎是:

#=> {["2017-01-01", "2"]=>[{:a=>"2017-01-01", :b=>"2", :c=>"1"}, {:a=>"2017-01-01", :b=>"2", :c=>"2"}], ["2017-01-02", "5"]=>[{:a=>"2017-01-02", :b=>"5", :c=>"1"}]}
第二点:

y.group_by { |g| g[:a] }.map do |key, value| 
   [key, value.group_by { |g| g[:b] }] 
end.to_h

#=> {"2017-01-01"=>{"2"=>[{:a=>"2017-01-01", :b=>"2", :c=>"1"}, {:a=>"2017-01-01", :b=>"2", :c=>"2"}]}, "2017-01-02"=>{"5"=>[{:a=>"2017-01-02", :b=>"5", :c=>"1"}]}}

非常感谢你的回答。我将向你提出另一个问题。如果我想通过第二个过滤器添加一个额外的组,我该如何继续?通过添加一个额外的
组?你的意思是对最终结果的最终结果的意思是这样的:<代码>{“2017-01-01-01-01”的意思是你的意思是对最终结果的最终结果的意思是:<代码>{“2017-2017-01-01-01”的意思是:<代码>{“2017-2017-01-01-01-01-01”的意思是,你的意思是对的,你的意思是对的,你的最终结果是,你的最终结果是这样的最终结果是::::<代码><代码>[代码>[代码>{2017-2017-2017-2017-2017-2017-01-01-01-01-01-01-01-01-01-01-01-01-01-01-01-01-01-01-01-01-01-01-01-01-01-01-01-01-01-01,,:2,,:b,,:2“,:2,,:c=,:c=>,:c=,:c]}]end.to_h]恩,Tohh < /Cords> Erm……是的,类似的东西会起作用。但是请注意我上面的评论:“……操作复杂的、嵌套的哈希对象……考虑重新设计它的工作原理……”在红宝石中处理复杂数据结构的方法比大型嵌套散列有更好的方法!1。[:a=>…
不是有效的Ruby对象。请编辑以更正。2.
代表什么并不明显。请将所有
替换为您希望作为示例输出的值。3.在给出示例时(通常)为每个输入对象分配一个变量(例如,
arr=[{:a=>…
)这样读者就可以在答案和评论中引用这些变量(这里只有一个),而无需定义它们。
#=> {["2017-01-01", "2"]=>[{:a=>"2017-01-01", :b=>"2", :c=>"1"}, {:a=>"2017-01-01", :b=>"2", :c=>"2"}], ["2017-01-02", "5"]=>[{:a=>"2017-01-02", :b=>"5", :c=>"1"}]}
y.group_by { |g| g[:a] }.map do |key, value| 
   [key, value.group_by { |g| g[:b] }] 
end.to_h

#=> {"2017-01-01"=>{"2"=>[{:a=>"2017-01-01", :b=>"2", :c=>"1"}, {:a=>"2017-01-01", :b=>"2", :c=>"2"}]}, "2017-01-02"=>{"5"=>[{:a=>"2017-01-02", :b=>"5", :c=>"1"}]}}