sort_by sort for descending array ruby sorting

for - ruby invert sort



ruby sort_by multiple fields (1)

Su clasificación funciona correctamente en MRI Ruby 1.8.7, 1.9.3 y 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>]

¿Has intentado enviar el resultado de tu sort_by a una consola? No estoy familiarizado con el render json: parte de tu código, pero quizás es allí donde las cosas van mal. Mi mejor suposición es que de alguna manera en la conversión a JSON (si eso es lo que hace) la clasificación se está arruinando.

Mi otra idea es que quizás esperas que sort_by modifique las entries ; no es asi. Si desea que las entries se sort_by! después de la llamada, use sort_by! (observe el ! al final del nombre del método).

Actualización: Parece que el problema es que desea una búsqueda insensible a mayúsculas y minúsculas. Simplemente agregando upcase debería hacer el truco:

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

Estoy ejecutando 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 ]}

Por alguna razón, no estoy obteniendo los resultados como se esperaba.

Obtengo primero todas las carpetas seguidas por todos los archivos, sin embargo, la clasificación del nombre está fallando.

Como ejemplo, obtengo estos para mis carpetas:

  1. contenido
  2. imágenes
  3. compartimiento

Para archivos:

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

Agrupa la parte dir / file correcta, pero los nombres están ordenados incorrectamente.

La salida a la consola se ve así después de la clasificación:

#<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>