2011-03-29 22 views
5

Mi matriz no se está ordenando correctamente. ¿Alguien me puede decir lo que estoy haciendo mal?javascript ordenar matriz

... 
sortArray = new Array ("hello", "Link to Google", "zFile", "aFile"); 

//sort array 
     if (dir == "asc") { 
      sortArray.sort(function(a,b){return a - b}); 
     } else { 
      sortArray.sort(function(a,b){return b - a}); 
     } 

     for(var i=0; i<sortArray.length; i++) { 
      console.log(sortArray[i]); 
     } 

el registro las muestra en el mismo orden en que se ingresaron.

+0

@Tim Cooper es el único que se necesita. –

+0

, por supuesto, también puedes hacer este práctico atajo pequeño ....................................... ................... '(sortArray.sort()) [(dir === 'asc'? 'reverse': 'slice')]()' – qwertymk

+0

@mVChr: ​​** [DEMO] (http://jsfiddle.net/pF2Gv/1/) ** – qwertymk

Respuesta

10

¿Quieres hacer una comparación en su clase, no una resta:

if (dir == "asc") { 
    sortArray.sort(function(a, b) { 
     a = a.toLowerCase(); 
     b = b.toLowerCase(); 
     return a === b ? 0 : a > b : 1 : -1; 
    }); 
} else { 
    sortArray.sort(function(a, b) { 
     a = a.toLowerCase(); 
     b = b.toLowerCase(); 
     return b === a ? 0 : b > a : 1 : -1; 
    }); 
} 

También utilicé toLowerCase() de manera que 'Enlace a Google' se coloca adecuadamente.

EDIT: Se ha actualizado para arreglar un problema de comparación de acuerdo con la respuesta de comment.

See example →

+0

Acepté el suyo para el complemento toLowerCase() ... aunque todos merecen un +1. – PruitIgoe

+3

Esta respuesta no parece funcionar en Chrome. Se supone que la función de comparación devuelve 0 si a y b son iguales, un entero positivo si a debe ordenarse a un índice más alto que b, y un entero negativo si a debe ordenarse a un índice más bajo que b. – Mike

+1

@Mike tiene razón. Esto debería ser: if (a.toLowerCase() === b.toLowerCase()) {return 0} else {return a.toLowerCase()

7

Está intentando ordenar restando cadenas, a lo que obtendrá NaN.

+0

Gracias a todos, obviamente, leí mal los documentos sobre ese: - D – PruitIgoe

6

El problema es que "a - b" trata las cadenas como números, lo que devuelve NaN. Obtendrá el comportamiento que busca (suponiendo que busca tipo de mayúsculas y minúsculas) si reemplaza sus clases con:

if (dir == "asc") { 
     sortArray.sort(function(a,b){return a < b ? -1 : 1}); 
    } else { 
     sortArray.sort(function(a,b){return b < a ? -1 : 1}); 
    } 
6

Sus funciones de comparación devuelve NaN, ya que recibe dos cadenas, y lleva a cabo la resta, una operación que no está bien definida en cadenas.

Lo que debe tener es algo más parecido a:

function(a,b){ 
    return a>b? 1 : (a<b ? -1 : 0); 
} 

o puede utilizar localeCompare:

function(a,b){ 
    return a.localeCompare(b); 
} 

Recuerde tratar apropiadamente el caso, por ejemplo, "L" < "a" mientras "l" > "a"