【问题标题】:ruby sort_by multiple fieldsruby sort_by 多个字段
【发布时间】:2013-06-12 22:20:24
【问题描述】:

我正在运行 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. bin

对于文件:

  1. global.asax
  2. web.config
  3. favicon.ico

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

排序后到控制台的输出是这样的:

#<struct FtpController::Item name="Content", dir=true, sort_dir=0>
#<struct FtpController::Item name="Images", dir=true, sort_dir=0>
#<struct FtpController::Item name="Scripts", dir=true, sort_dir=0>
#<struct FtpController::Item name="Views", dir=true, sort_dir=0>
#<struct FtpController::Item name="bin", dir=true, sort_dir=0>
#<struct FtpController::Item name="Global.asax", dir=false, sort_dir=1>
#<struct FtpController::Item name="Web.config", dir=false, sort_dir=1>
#<struct FtpController::Item name="favicon.ico", dir=false, sort_dir=1>
#<struct FtpController::Item name="packages.config", dir=false, sort_dir=1>
#<struct FtpController::Item name="robots.txt", dir=false, sort_dir=1>

【问题讨论】:

    标签: ruby sorting


    【解决方案1】:

    您的排序在 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]}
    # => [#<struct Item name="bin", dir=true, sort_dir=0>,
    #     #<struct Item name="content", dir=true, sort_dir=0>,
    #     #<struct Item name="images", dir=true, sort_dir=0>,
    #     #<struct Item name="favicon.ico", dir=false, sort_dir=1>,
    #     #<struct Item name="global.asax", dir=false, sort_dir=1>,
    #     #<struct Item name="web.config", dir=false, sort_dir=1>]
    

    您是否尝试过将sort_by 的结果输出到控制台?我不熟悉代码的render json: 部分,但也许这就是问题所在。我最好的猜测是,不知何故,在转换为 JSON 的过程中(如果是这样的话),排序变得一团糟。

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

    更新:看起来问题是您想要不区分大小写的搜索。只需添加 upcase 即可:

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

    【讨论】:

    • 我将控制台输出包含在原始问题中。另外,我不希望条目本身被排序。我期望它将排序列表返回给渲染方法。但是,我得到的 json 和控制台输出匹配。
    • @Mike 看起来问题是你想要一个不区分大小写的排序,然后呢?因为您的输出是排序的,所以首先是大写。
    • 您能否将您的评论添加为答案,以便我将其投票为正确。我在名称中添加了一个小写字母,它按预期工作。谢谢!
    • 这对于三个条件而不是两个,并且排序时需要不同条件的不同顺序如何?例如。我有包含日期​​、时间戳、状态列的数据库条目。我试图按日期(降序)对结果进行排序,然后按状态(升序)和时间(升序)日期不是实际列,我正在使用 timestamp.to_date 检索日期尝试这个'代码'@results = @results.sort_by { |x| [-x.timestamp.to_date, x.status, x.timestamp]} 获取所需订单失败,因为 x.timestamp.to_date 不是整数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 2021-04-25
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多