ruby sort_by多个字段

我正在运行Ruby 1.9.3p392。

Item = Struct.new( :name, :dir, :sort_dir ) entries = ftp.list() entries.map!{|e| Net::FTP::List.parse(e) }.map!{|e| Item.new( e.basename, e.dir?, (e.dir? ? 0 : 1) ) } render json: entries.sort_by{ |e| [ e.sort_dir, e.name ]} 

出于某种原因,我没有按预期得到结果。

我确实先获取所有文件夹,然后是所有文件,但名称排序失败。

作为一个例子,我得到了我的文件夹:

  1. 内容
  2. 图片
  3. 箱子

对于文件:

  1. Global.asax中
  2. web.config中
  3. favicon.ico的

它将目录/文件部分分组正确,但名称排序不正确。

排序后,控制台的输出如下所示:

 # # # # # # # # # # 

您的排序在MRI Ruby 1.8.7,1.9.3和2.0.0中正常工作:

 Item = Struct.new(:name, :dir, :sort_dir) entries = [Item.new('favicon.ico', false, 1), Item.new('bin', true, 0), Item.new('web.config', false, 1), Item.new('images', true, 0), Item.new('global.asax', false, 1), Item.new('content', true, 0)] entries.sort_by{|e| [e.sort_dir, e.name]} # => [#, # #, # #, # #, # #, # #] 

您是否尝试将sort_by的结果输出到控制台? 我不熟悉render json:代码的一部分,但也许这就是出错的地方。 我最好的猜测是,在某种程度上转换为JSON(如果这就是它的作用),排序变得混乱了。

我的另一个想法是,你可能期望sort_by修改entries ; 它不是。 如果您希望在调用后对entries本身进行排序,请使用sort_by! (注意方法名称末尾的! )。

更新:看起来问题是您需要不区分大小写的搜索。 简单地添加upcase应该可以做到这一点:

 entries.sort_by{|e| [e.sort_dir, e.name.upcase]}