Ruby 通常,它会给我们期望的结果。当我们使用复杂的数组/散列时,它会变得很难。我花了几个小时寻找解决办法。再次感谢您的解释,非常有用!现在,我可以简单地访问数据。对于您的编辑:好的,没有重复。(这是第一个和第二个字段上的SQL group_by的结果。)但后面会

Ruby 通常,它会给我们期望的结果。当我们使用复杂的数组/散列时,它会变得很难。我花了几个小时寻找解决办法。再次感谢您的解释,非常有用!现在,我可以简单地访问数据。对于您的编辑:好的,没有重复。(这是第一个和第二个字段上的SQL group_by的结果。)但后面会,ruby,Ruby,通常,它会给我们期望的结果。当我们使用复杂的数组/散列时,它会变得很难。我花了几个小时寻找解决办法。再次感谢您的解释,非常有用!现在,我可以简单地访问数据。对于您的编辑:好的,没有重复。(这是第一个和第二个字段上的SQL group_by的结果。)但后面会有意思。Daniël关于代码破坏性的观点很重要!如果您想销毁在方法中创建的对象,但我怀疑销毁参数是否是一个好主意。谁知道您的代码将来会变成什么样子,或者谁将对此负责?当我们将一个对象传递给一个方法时,我们希望它受到尊重,所以如果它被滥用,就会发


通常,它会给我们期望的结果。

当我们使用复杂的数组/散列时,它会变得很难。我花了几个小时寻找解决办法。再次感谢您的解释,非常有用!现在,我可以简单地访问数据。对于您的编辑:好的,没有重复。(这是第一个和第二个字段上的SQL group_by的结果。)但后面会有意思。Daniël关于代码破坏性的观点很重要!如果您想销毁在方法中创建的对象,但我怀疑销毁参数是否是一个好主意。谁知道您的代码将来会变成什么样子,或者谁将对此负责?当我们将一个对象传递给一个方法时,我们希望它受到尊重,所以如果它被滥用,就会发生非常糟糕的事情。当然,故意修改参数(根据调用方法的需要)是另一回事。当我们使用复杂的数组/散列时,它变得非常困难。我花了几个小时寻找解决办法。再次感谢您的解释,非常有用!现在,我可以简单地访问数据。对于您的编辑:好的,没有重复。(这是第一个和第二个字段上的SQL group_by的结果。)但后面会有意思。Daniël关于代码破坏性的观点很重要!如果您想销毁在方法中创建的对象,但我怀疑销毁参数是否是一个好主意。谁知道您的代码将来会变成什么样子,或者谁将对此负责?当我们将一个对象传递给一个方法时,我们希望它受到尊重,所以如果它被滥用,就会发生非常糟糕的事情。当然,故意修改参数(根据调用方法的需要)是另一回事。谢谢你,我也会检查你的代码,以了解它是如何工作的,但与Daniël Knippers的代码几乎相同。@Alexis_user Yes,除了它使用
.inject
,而不是像我一样在循环上方声明结果。其余的都一样,只是我在一行上挤了更多的东西。不知道为什么它获得了更多的选票;)同样感谢您,我将检查您的代码以了解其工作原理,但与Daniël Knippers的代码几乎相同。@Alexis_用户是的,只是它使用
.inject
,而不是像我一样在循环上方声明结果。其余的都一样,只是我在一行上挤了更多的东西。不知道为什么它获得了更多的选票;)啊哈,也谢谢你!另一种方法,但使用
map
groupby
,很好学;)啊哈,也谢谢你!另一种方法,但使用
map
groupby
,很好学;)哇,这真是个教训!非常感谢。我现在更懂ruby了!正是由于这个例子的类型,我学到了越来越多的Ruby!哇,这真是个教训!非常感谢。我现在更懂ruby了!正是由于这个例子的类型,我学到了越来越多的Ruby!
a = [ [1, 0, "a", "b"], [1, 1, "c", "d"], [2, 0, "e", "f"], [3, 1, "g", "h"] ]
b= {
     1=> {0=>["a", "b"], 1=>["c", "d"]} , 
     2=> {0=>["e", "f"]} , 
     3=> {1=>["g", "h"]}
   }
a.group_by{ |e| e.shift}.map { |k, v| {k=>v.group_by{ |e| e.shift}} }

=> [{1=>{0=>[["a", "b"]], 1=>[["c", "d"]]}},
   {2=>{0=>[["e", "f"]]}}, {3=>{1=>[["g", "h"]]}}]
b = {}
a.each do |aa|
 (b[aa[0]] ||= {})[aa[1]] = aa[2..3]
end
b # => {1=>{0=>["a", "b"], 1=>["c", "d"]}, 2=>{0=>["e", "f"]}, 3=>{1=>["g", "h"]}}
# Added [1, 1, "x", "y"], removed some others
a = [ [1, 0, "a", "b"], [1, 1, "c", "d"], [1, 1, "x", "y"] ]
b = Hash[a.group_by(&:shift).map { |k, v| [k, v.group_by(&:shift) ] }]
#=> {1=>{0=>[["a", "b"]], 1=>[["c", "d"], ["x", "y"]]}}
a = [ [1, 0, "a", "b"], [1, 1, "c", "d"], [2, 0, "e", "f"], [3, 1, "g", "h"] ]

result = a.inject({}) do |acc,(a,b,c,d)|
  acc[a] ||= {}
  acc[a][b] = [c,d]
  acc
end

puts result.inspect
{1=>{0=>["a", "b"], 1=>["c", "d"]}, 2=>{0=>["e", "f"]}, 3=>{1=>["g", "h"]}}
[[1, 0, "a", "b"], [1, 1, "c", "d"], [2, 0, "e", "f"], [3, 1, "g", "h"]].
    group_by{ |e| e.shift }.
    map{ |k, v| [k, v.inject({}) { |h, v| h[v.shift] = v; h }] }.
    to_h
#=> {1=>{0=>["a", "b"], 1=>["c", "d"]}, 2=>{0=>["e", "f"]}, 3=>{1=>["g", "h"]}}
def convert(arr)
  h = arr.group_by(&:first)
  h.keys.each { |k| h[k] = h[k].group_by { |a| a[1] }
                               .tap { |g| g.keys.each { |j|
                                            g[j] = g[j].first[2..-1] } } }
  h
end
a = [ [1, 0, "a", "b"], [1, 1, "c", "d"], [2, 0, "e", "f"], [3, 1, "g", "h"] ]
convert(a)
  #=> {1=>{0=>["a", "b"], 1=>["c", "d"]}, 2=>{0=>["e", "f"]}, 3=>{1=>["g", "h"]}}
h = a.group_by(&:first)
  #=> {1=>[[1, 0, "a", "b"], [1, 1, "c", "d"]],
  #    2=>[[2, 0, "e", "f"]],
  #    3=>[[3, 1, "g", "h"]]}

keys = h.keys
  #=> [1, 2, 3]
f = h[k].group_by { |a| a[1] }
  #=> [[1, 0, "a", "b"], [1, 1, "c", "d"]].group_by { |a| a[1] }
  #=> {0=>[[1, 0, "a", "b"]], 1=>[[1, 1, "c", "d"]]}
g.keys #=> [0, 1]
g[j] = g[j].first[2..-1]
  #=> g[0] = [[1, 0, "a", "b"]].first[2..-1]
  #=> ["a", "b"]
g[j] = g[j].first[2..-1]
  #=> g[1] = [[1, 1, "c", "d"]].first[2..-1]
  #=> ["c", "d"]
h[1] = g
  #=> {0=>["a", "b"], 1=>["c", "d"]}