我有一个包含一堆属性的文件列表。其中一个属性是文件名,这是我想要对列表进行排序的方式。然而,列表是这样的:文件名 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/