在Ruby中对数组数组进行排序

我有一个像这样的数组:

irb(main):028:0> device_array => [["name1", "type1", ["A", "N", "N"], ["Attribute", "device_attribute"], 9], ["name2","type2", ["A", "N", "N"], ["Attribute", "device_attribute"], 7]] 

我想在第4个元素上对整个device_array进行排序。

我试过了

 AllDevicesController.all_devices.sort do | a,b | for i in 0..(AllDevicesController.all_devices.length - 1) do a[i][4]  b[i][4] end end 

我也尝试过:

 AllDevicesController.all_devices.sort do | a,b | a[][4]  b[][4] end 

这两种方法都没有奏效。

我使用它作为参考: http : //ariejan.net/2007/01/28/ruby-sort-an-array-of-objects-by-an-attribute/

我想我错过了一些ruby,这让我很容易。

您不能将<=>nil一起使用。

你的代码应该是这样的:

 AllDevicesController.all_devices.sort do |a, b| a[4].nil? ? -1 : b[4].nil? ? 1 : a[4] <=> b[4] end 

这将把没有索引元素4的子数组放在结果的开头。 换句话说,将-11交换。

您也可以使用sort_by而不是sort 。 我认为这已经在Ruby 1.8.7中引入了(因此如果您使用的是旧版本,它可能不起作用)。 它类似于:

 AllDevicesController.all_devices.sort_by { |e| e.nil? ? 0 : e[4] } 

这将处理没有第4个元素的子数组,就像它是0.更改此常量以适合您。

编辑:

调整输入后,现在很清楚你是非常接近正确的答案。 你的代码应该是:

 AllDevicesController.all_devices.sort do |a, b| a[4] <=> b[4] end 

或者简单(假设Ruby 1.8.7或更高版本):

 AllDevicesController.all_devices.sort_by { |e| e[4] } 

在这两种情况下,变量ab都将包含原始数组的元素,这就是为什么你可以直接访问任何位置的元素(并且你不需要类似a[][4] ,这是不正确的Ruby语法)。

第4个元素实际上是索引3,这意味着你会这样做:

 all_devices.sort do |a, b| a[3] <=> b[3] end 

如果你真的想要在索引4处对元素进行排序(对于all_devices的第一个元素不存在),那么首先需要将对比添加到NilClass:

 class NilClass def <=> (other) 1 end end all_devices.sort do |a, b| a[4] <=> b[4] end 

这将是nil到最后。 将<=>的返回值更改为-1以将它们排序到前面。

我知道这个问题已得到解答,我现在不打算解决,但是……

您确定arrays最适合该数据吗? 我在谈论这些数据元素:[“name1”,“type1”,[“A”,“N”,“N”],[“Attribute”,“device_attribute”],9]

看起来像一个Struct或者某些东西可能更适合和可管理,然后你可以拥有一个Structs数组。 只是一个想法。