2011-12-28 9 views
5

No estoy usando una matriz asociativa. Estoy usando una matriz 1d como esta,Cómo ordenar una matriz en JavaScript

array("1,a","5,b","2,c","8,d","6,f"); 

¿Cómo puedo ordenar esta matriz?

El resultado debe ser,

array("1,a","2,c","5,b","6,f","8,d"); 
+0

Qué problema tiene con [ '.Sort()'] (https://developer.mozilla.org/es/JavaScript/Reference/Global_Objects/Array/sort)? ¿La idea es hacer un orden numérico por el número primero, con un orden secundario por la siguiente letra? ¿O simplemente hacer un orden de cadena estándar en todo el texto? Es decir, cómo desea ordenar '[" 1, a "," 11, a "," 2, b "," 2, c "]' – nnnnnn

+0

sort() funciona ... Cometí un error en mi código. – Anish

+0

posible duplicado de [tipo natural de texto y números, JavaScript] (http://stackoverflow.com/questions/2802341/natural-sort-of-text-and-numbers-javascript) – outis

Respuesta

1

Voy a seguir adelante y asumir que desea ordenar por el número de pieza en primer lugar, la clasificación numérica, y luego tener un lexographic secundaria (cadena) en una especie el bit después de la coma De esta forma, un valor como "11, a" terminará después de "2, a"; si solo hace una clasificación por defecto "11, a" terminará antes de "2, a". Por lo tanto:

var a = ["1,a","11,a","8,a","24,z","5,b","2,c","8,d","6,f"]; 

a.sort(function(a,b) { 
    var aparts = a.split(","), 
     bparts = b.split(","), 
     anum = +aparts[0], // convert first part to number 
     bnum = +bparts[0], 
     aletter = aparts[1], 
     bletter = bparts[1]; 

    if (anum === bnum) 
     return aletter < bletter ? -1 : aletter === bletter ? 0 : -1; 
    else 
     return anum - bnum; 
}); 

Resultado:

["1,a", "2,c", "5,b", "6,f", "8,a", "8,d", "11,a", "24,z"] 
+0

Genial. Tuve la pblm similar. Lo noté justo ahora. si el segundo elemento es similar, no se está ordenando correctamente. tu código me ayudó. Muchas gracias – Anish

+0

@Anish, Alex maneja esto mucho más elegante ... http://stackoverflow.com/a/8652418/555384 – jondavidjohn

+0

@jondavidjohn - eso puede ser más elegante, pero no es equivalente porque no incluye un tipo secundario en la parte alfa. – nnnnnn

2

Uso array.sort() función integrada de JS. Documentación aquí: http://www.w3schools.com/jsref/jsref_sort.asp

+0

array.sort no ordenará lo anterior uno correctamente – Anish

+3

+1, pero quiero abogar por MDN (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort) sobre W3Schools. Vea por qué http://w3fools.com/ –

+0

@Anish Sí lo hace. Ver mi código de ejemplo de trabajo ... http://jsfiddle.net/Dht33/ – jondavidjohn

1

tratan con:

function sortNumber(a,b) 
{ 
return (a.split(","))[0] - (b.split(","))[0] ; 
} 

var n = ["1,a","5,b","2,c","8,d","6,f"]; 
alert(n.sort(sortNumber)); 
+0

No. No está ordenando – Anish

+0

lo siento - mi error - Corregí el código - ahora funciona –

4

sort() sin una función de clasificación a medida que va a clasificar como desea (lexicográfico).

>>> ["1,a","5,b","2,c","8,d","6,f"].sort(); 
["1,a", "2,c", "5,b", "6,f", "8,d"] 

Tenga en cuenta que esto ordenará la matriz original. Puede hacer una copia superficial con slice().

Si alguno de sus números es mayor que 9, y desea ordenarlo por el ordinal del número, necesitará una función de clasificación personalizada.

["1,a","5,b","2,c","8,d","6,f"].sort(function(a, b) { 
    return parseInt(a, 10) - parseInt(b, 10); 
}); 
+0

Gracias por su respuesta. El código de jondavidjohn funciona para mí. – Anish

1

Aquí es lo que hago:

var arr1 = new Array("1,a","5,b","2,c","8,d","6,f"); 
var arr2 = arr1.sort(function(a, b){ 
    var ax = a.split(","); 
    var bx = b.split(","); 
    return ax[0]-bx[0]; 
}); 

document.getElementById("result").innerHTML = arr2.join(" : "); 
1

Usted tiene que escribir su propia función de comparación para comparar los números, de lo contrario el valor por defecto sort() pondría algo así como "40,a" antes "5,b".

Aquí hay un ejemplo que simplemente se divide en el carácter , y asume el valor antes de que sea numérico. He agregado "40,a" en el ejemplo para mostrar que ordena números> 9 correctamente.

function mySort(a,b) 
{ 
    return a.split(",", 1) - b.split(",", 1); 
} 

var theArray = ["1,a", "5,b", "2,c", "40,a", "8,d", "6,f"]; 
theArray.sort(mySort); // "1,a","2,c","5,b","6,f","8,d","40,a" 
+0

Gracias por su respuesta. creo que el método predeterminado sort() hizo un trabajo para mí. – Anish

0

Prueba esto:

<script type="text/javascript"> 
var testArray = new Array(); 
testArray[0] = '1'; 
testArray[1] = '5'; 
testArray[2] = '9'; 
testArray[3] = '8'; 
testArray[4] = '6'; 
testArray[5] = '2'; 
var getlength = testArray.length; 
testArray.sort(function(a,b){return a - b}); 
for(var i=0; i<getlength;i++) {   
    alert(testArray[i]); 
} 
</script> 
1

probar este

<script> 
var abc=new Array("1,a","5,b","2,c","8,d","6,f"); 
document.write("<br/>"); 
document.write(abc.sort()); 
</script> 
Cuestiones relacionadas