有没有办法排序,以便"维生素B12"不在"维生素B6"的前面?

nop*_*ole 2 ruby sorting natural-sort

在Ruby on Rails中,默认的排序顺序是

Vitamin A
Vitamin B12
Vitamin B6
Run Code Online (Sandbox Code Playgroud)

是否有一种机制或快速方式,以便它按照自然语言方式进行排序,以便B6之前显示B12

saw*_*awa 8

尝试类似的东西:

class Array
  def smart_sort
    sort_by{|s| (' '+s).scan(/(\d+)|(\D+)/).map{|d, s| s || d.to_i}}
  end
end

a = ['Vitamin A', 'Vitamin B12', 'Vitamin B6']
p a.smart_sort

# => ["Vitamin A", "Vitamin B6", "Vitamin B12"]
Run Code Online (Sandbox Code Playgroud)

它按数字和非数字排序.

b = ['3c17d', '1a34be',  '3x1a', '1b01c', '1a34bb']
p b.smart_sort

# => ["1a34bb", "1a34be", "1b01c", "3c17d", "3x1a"]
Run Code Online (Sandbox Code Playgroud)

这可能类似于在Windows中对目录中的文件名进行排序时所执行的操作.


更新:更新版本.不需要' '+,因为它是自动提供的split.它还消除了指定互补\d\D正则表达式的冗余.

class Array
  def smart_sort
    sort_by{|s| s.split(/(\d+)/).each_slice(2).flat_map{|s, d| [s, d.to_i]}}
  end
end
Run Code Online (Sandbox Code Playgroud)