我有一个哈希数组:
a=[{ 'foo'=>0,'bar'=>1 },
{ 'foo'=>0,'bar'=>2 },
... ]
我想首先按照每个哈希表的“foo”进行排序,然后按照“bar”进行排序。谷歌告诉我应该这样做:
a.sort_by {|h| [ h['foo'],h['bar'] ]}
但这个代码会让我遇到 "comparison of Array with Array failed" 的 ArgumentError 错误。这是什么意思?
我有一个哈希数组:
a=[{ 'foo'=>0,'bar'=>1 },
{ 'foo'=>0,'bar'=>2 },
... ]
我想首先按照每个哈希表的“foo”进行排序,然后按照“bar”进行排序。谷歌告诉我应该这样做:
a.sort_by {|h| [ h['foo'],h['bar'] ]}
但这个代码会让我遇到 "comparison of Array with Array failed" 的 ArgumentError 错误。这是什么意思?
a.sort { |a, b| [a['foo'], a['bar']] <=> [b['foo'], b['bar']] }
Enumerable#sort_by(&block)
大致相当于sort { |a,b| block.call(a) <=> block.call(b) }
,只不过以一种更高效的方式完成。如果这能够运作而sort_by
不能,则可能存在其他问题。 - wuputaha=[{'foo'=>0,'bar'=>2},{'foo'=>0,'bar'=>1},{'foo'=>2,'bar'=>1},{'foo'=>1,'bar'=>0}]
。 - herpderp- dj2a.sort { |a, b| [a['foo'], a['bar']] <=> [b['foo'], b['bar']] } => [{"foo"=>0, "bar"=>1}, {"foo"=>0, "bar"=>2}, {"foo"=>1, "bar"=>0}, {"foo"=>2, "bar"=>1}]
a.sort {|a,b| [ a['foo'],a['bar'] ] <=> [b['foo'],b['bar'] ]}
只返回了 ["foo"]
。 - herpderp这可能意味着您的某个对象中缺少了'foo'或'bar'字段之一。
比较结果类似于nil <=> 2
,它返回nil
(而不是-1
、0
或1
),并且#sort_by
不知道如何处理nil
。
请尝试此操作:
a.sort_by {|h| [ h['foo'].to_i, h['bar'].to_i ]}
你发布的代码在 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}]
当用于比较的结果数组同时包含nil值和非nil值时,会出现此异常。
Array与Array的比较失败
这意味着(至少在我的情况下),数组元素的类型不同。当我确保所有数组项都是相同类型的(例如 Integer
)时,排序开始工作。
[{'foo'=>99,'bar'=>1},{'foo'=>0,'bar'=>2, 'qwe' => 7}]
a.sort_by{|v| v['qwe']}
ArgumentError: comparison of NilClass with 7 failed
a.sort_by{|v| [v['qwe']].select{|k| not k.nil?}}
[v['index'],v['count'],v['digit'],v['value']]
digit不稳定
a.compact.sort_by { |h| [h['foo'].downcase, h['bar'].downcase] }
升序
,按第二个键降序
等)对哈希数组进行排序。
我创建了这个助手类,称之为AwesomeSort
,因为它很棒,它是用Ruby编写的。
https://gist.github.com/pucinsk/36ffef881622b2d9dcca6716f403dc27