我有一个数组
[ [1,23,true], [2,33,false],[3,44,true] ]
我试图根据每个内部数组的[2]值对数组进行排序,所以结果是
true_values: [ [1,23,true],[3,44,true] ]
false_values: [ [2,33,false] ]
我可以选择数组对象,但正在寻找一种简洁的排序和输出哈希的方法。
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]]}
这里我使用Enumerable#group_by
首先按true或false对其进行分组,然后根据在v中找到的数组的第二个元素的内容对该哈希进行排序。最后,我们调用.to_h
或to hash来获得上面概述的格式。
[10] pry(main)> arr
=> [[1, 23, true], [2, 33, false], [3, 44, true]]
[11] pry(main)> arr.group_by { |x| x[2] }.sort_by { |_, v| v.map { |i| i[1] } }.to_h
=> {true=>[[1, 23, true], [3, 44, true]], false=>[[2, 33, false]]}
这里有一种方法:
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
,以提出第二点。