按数组值将数组数组排序为ruby中的哈希值

时间:2015-02-12 23:47:12

标签: ruby-on-rails ruby arrays ruby-on-rails-4

我有一个数组数组

[ [1,23,true], [2,33,false],[3,44,true] ]

我试图根据每个内部数组的[2]值对数组进行排序,结果将是

true_values: [ [1,23,true],[3,44,true] ]
false_values: [ [2,33,false] ]

我可以选择数组对象,但我正在寻找一种简洁的排序和输出哈希的方法。

3 个答案:

答案 0 :(得分:4)

x = [ [1,23,true], [2,33,false],[3,44,true] ]

由于group_by保留了您可以在分组之前对其进行排序的顺序:

p x.sort_by{|x|x[1]}.group_by(&:last) #=> {true=>[[1, 23, true], [3, 44, true]], false=>[[2, 33, false]]}

如果您不需要在散列中保留true / false值:

p  x.sort_by{|x|x[1]}.group_by(&:pop) #=> {true=>[[1, 23], [3, 44]], false=>[[2, 33]]}

答案 1 :(得分:1)

在这里,我先使用Enumerable#group_by将其分组为true或false,然后按照v中找到的数组的第二个元素的内容对该哈希进行排序。最后我们调用{{1}或者哈希以获得上面概述的格式。

.to_h

答案 2 :(得分:1)

这是一种方式:

arr = [[1, 44, true], [2, 33, false], [3, 23, true]]

arr.sort_by { |*_,tf| (tf && 0) || 1 }.chunk { |*_,tf| tf }.to_h
  #=> {true=>[[1, 44, true], [3, 23, true]], false=>[[2, 33, false]]}     

如果你想要打破arr[i][1]的关系,那么:

arr.sort_by { |_,e,tf| [(tf && 0) || 1, e] }.chunk { |*_,tf| tf }.to_h
  #=> {true=>[[3, 23, true], [1, 44, true]], false=>[[2, 33, false]]}

请注意,我已将问题中的arr更改为第二点。