Ruby按多个值排序?

her*_*erp 63 ruby

我有一系列哈希:

a=[{ 'foo'=>0,'bar'=>1 },
   { 'foo'=>0,'bar'=>2 },
   ... ]
Run Code Online (Sandbox Code Playgroud)

我想先按每个哈希的'foo'排序数组,然后按'bar'排序.谷歌告诉我这就是它的完成方式:

a.sort_by {|h| [ h['foo'],h['bar'] ]}
Run Code Online (Sandbox Code Playgroud)

但是这给了我ArgumentError"Array与Array的比较失败".这是什么意思?

dj2*_*dj2 65

a.sort { |a, b| [a['foo'], a['bar']] <=> [b['foo'], b['bar']] }
Run Code Online (Sandbox Code Playgroud)

  • 这是一回事.`Enumerable#sort_by(&block)`大致是`sort {| a,b | block.call(a)<=> block.call(b)}`,除了以更有效的方式完成.如果这有效,但`sort_by`没有,那么其他东西就不对了. (11认同)
  • sort_by的一个优点是它更干. (6认同)

Wil*_*den 22

这可能意味着您错过了其中一个对象中的某个字段'foo'或'bar'.

比较结果就像nil <=> 2是返回nil(代替-1,01)并且#sort_by不知道如何处理nil.

试试这个:

a.sort_by {|h| [ h['foo'].to_i, h['bar'].to_i ]}
Run Code Online (Sandbox Code Playgroud)


Phr*_*ogz 12

您发布的内容适用于Ruby 1.8.7:

ruby-1.8.7-p302 > a = [{'foo'=>99,'bar'=>1},{'foo'=>0,'bar'=>2}]
 => [{"foo"=>99, "bar"=>1}, {"foo"=>0, "bar"=>2}] 

ruby-1.8.7-p302 > a.sort_by{ |h| [h['foo'],h['bar']] }
 => [{"foo"=>0, "bar"=>2}, {"foo"=>99, "bar"=>1}] 

ruby-1.8.7-p302 > a.sort_by{ |h| [h['bar'],h['foo']] }
 => [{"foo"=>99, "bar"=>1}, {"foo"=>0, "bar"=>2}] 
Run Code Online (Sandbox Code Playgroud)