2011-01-24 35 views
7

¿Cómo maneja Array.prototype.sort los valores indefinidos en una matriz?javascript array.sort con valores indefinidos

var array = [1,undefined,2,undefined,3,undefined,4]; 
var array2 = []; 
array2[0] = 1;array2[2] = 2;array2[4] = 3;array2[6] = 4; 

Al llamar array.sort(function(l,r) { ... }); Los valores undefined Nunca se pasan como l o r.

¿Puedo garantizar que todos los valores indefinidos siempre irán al final de la matriz para todos los navegadores?

estaría el siguiente bucle de manejar todos los datos no undefined en una matriz

array.sort(); 
for (var i = 0; array[i] !== undefined; i++) { 
    // handle array 
} 

Usted puede asumir que nadie declaró undefined como una variable.

+2

En IE <= 8, van a ser retirados de la matriz completamente. Ver: https://github.com/documentcloud/underscore/issues/484#issuecomment-4055242 – Gijs

Respuesta

7

Sí, puede asumir con seguridad que undefined se moverán al final de la matriz.

De MDC:

En JavaScript 1.2, este método ya no convierte los elementos definidos en null; en cambio, los ordena a la gran final de la matriz

Desde el spec, 15.4.4.11 :

Dado que los valores de propiedad que no existen siempre comparan mayor que los valores de propiedad definidos, y indefinido compara siempre mayor que cualquier otro valor, los valores de propiedad indefinidos siempre se ordenan al final del resultado, seguidos por valores de propiedad inexistentes.

+0

Gracias. No es necesario que existan simplemente para que no haya "lagunas" que contengan valores indefinidos en la matriz. Por favor, agregue algún tipo de sección o número de página al enlace de la especificación. – Raynos

0

todos los valores indefinidos irán al final de la matriz, independientemente de su orden en la declaración. (al menos así es como funciona en el motor js de Chrome)

0

Parece que los valores indefinidos estarán en la parte inferior de la lista. Aquí hay algunos ejemplos de código para mostrarle lo que sucede:

var a = [1,undefined,2,undefined,3,undefined,4]; 
    a = a.sort(); 
    for(i = 0 ; i < a.length ; i++) 
    { 
    alert(a[i]); 
    } 

Esto es, por supuesto, el comportamiento predeterminado de JavaScript. Si sobrescribe el comportamiento predeterminado, solo usted lo sabrá.

-3

Safari simplemente elimina undefined propiedad cuando se llama a sort(); método

Cuestiones relacionadas