ruby-on-rails - Ruby 有 natural_sort_by 方法吗?

标签 ruby-on-rails ruby

我有一个包含一堆属性的文件列表。其中一个属性是文件名,这是我想要对列表进行排序的方式。然而,列表是这样的:文件名 1、文件名 2、文件名 10、文件名 20。

ruby sort_by 方法产生这个:

files = files.sort_by { |file| file.name }
=> [filename 1, filename 10, filename 2, filename 20]

我想要一个更易于阅读的列表,例如文件名 1、文件名 2、文件名 10、文件名 20

我找到了 natural_sort gem 但它似乎只能像排序方法一样工作。我需要一些可以指定数组排序依据的东西。

有什么帮助吗?

最佳答案

这是另一种“自然”排序方法:

class String
  def naturalized
    scan(/[^\d\.]+|[\d\.]+/).collect { |f| f.match(/\d+(\.\d+)?/) ? f.to_f : f }
  end
end

这会将诸如 "Filename 10" 之类的内容转换为一个简单的数组,用 float 代替数字 [ "Filename", 10.0 ]

您可以在列表中使用它:

files.sort_by! { |file| file.name.to_s.naturalized }

这样做的好处是可以在不可预测的位置处理任意数字。该 block 中偏执的 .to_s 调用是为了确保排序时有一个字符串而不是无意的 nil

关于ruby-on-rails - Ruby 有 natural_sort_by 方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4078906/

相关文章:

html - 根据 rails 中的路线参数加载部分

ruby-on-rails - 如何在 Rails 控制台中测试/添加关联数据

ruby - 为什么 Enumerable#detect 需要 Proc/lambda?

ruby-on-rails - 使用 Rspec + Factory Girl 在新线程/进程测试中数据库为空

ruby - VMware Workstation 8 自动化与 Ruby/Rake?

ruby - RSpec:允许实例变量接收方法

ruby-on-rails - 如何将 gem 的插件 "convert"使其变为 "private"?

ruby-on-rails - 使用 Heroku 和 BigRock 的裸域

ruby-on-rails - 使用 STI 时是否可以从包含关联中提取?

javascript - css 和 js 无法在 Rails 生产模式下工作