在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的子数组放在结果的开头。 换句话说,将-1
与1
交换。
您也可以使用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] }
在这两种情况下,变量a
和b
都将包含原始数组的元素,这就是为什么你可以直接访问任何位置的元素(并且你不需要类似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数组。 只是一个想法。