有人能告诉我如何根据自定义字符串对嵌套数组进行排序吗?例如,有没有办法排序:
[['Red','Blue'],['Green','Orange'],['Purple','Yellow']]
Run Code Online (Sandbox Code Playgroud)
by "Orange","Yellow"然后"Blue"呢?最终结果如下:
[['Green','Orange'],['Purple','Yellow'],['Red','Blue']]
Run Code Online (Sandbox Code Playgroud)
它不按字母顺序排序.我很想知道我是否可以定义值来排序以实现上述目标.
sort_by 对于那种排序总是非常方便:
a = [['Red','Blue'],['Green','Orange'],['Purple','Yellow']]
order_array = ['Orange', 'Yellow', 'Blue']
p a.sort_by { |arr| order_array.index(arr[1]) }
# => [["Green", "Orange"], ["Purple", "Yellow"], ["Red", "Blue"]]
Run Code Online (Sandbox Code Playgroud)
ORDER = %w[Orange Yellow Blue]
ary = [['Red','Blue'],['Green','Orange'],['Purple','Yellow']]
ary.group_by{ |a| a.last }.values_at(*ORDER)
# => [[["Green", "Orange"]], [["Purple", "Yellow"]], [["Red", "Blue"]]]
Run Code Online (Sandbox Code Playgroud)
以下是group_by聚会带来的内容:
ary.group_by{ |a| a.last }
# => {"Blue"=>[["Red", "Blue"]],
# "Orange"=>[["Green", "Orange"]],
# "Yellow"=>[["Purple", "Yellow"]]}
Run Code Online (Sandbox Code Playgroud)
一旦获得了用于对每个数组进行分组的值的哈希值,就values_at可以轻松地以正确的顺序提取它们。
这是一种非常快速且有效的完成任务的方法,因为它几乎不会随着增长而减慢,ary因为没有进行真正的排序,它只是按值分组,然后以给定的顺序从哈希中提取。
如果您想要与示例中完全相同的数组数组,则flatten结果一次:
ary.group_by{ |a| a.last }.values_at(*ORDER).flatten(1)
# => [["Green", "Orange"], ["Purple", "Yellow"], ["Red", "Blue"]]
Run Code Online (Sandbox Code Playgroud)
如果有多个“橙色”、“黄色”或“蓝色”元素,您就不会想要这样做,因为结果不会非常有用。