sort por ordenar objetos objects fecha array alphabetically javascript sorting cross-browser stable-sort

javascript - por - Array.sort Ordenando la estabilidad en diferentes navegadores



sort json javascript (3)

¿Cuál es la estabilidad de Array.sort en diferentes navegadores? Sé que la especificación de ECMA Script no especifica qué algoritmo usar, ni especifica si el género debe ser estable.

Encontré esta información para Firefox en https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/sort que especifica que Firefox usa un tipo estable.

¿Alguien sabe sobre IE 6/7/8, Chrome, Safari?


Si está buscando una lista de navegadores donde debe utilizar un algoritmo de clasificación no nativo, mi sugerencia es no hacerlo .

En su lugar, haga una especie de comprobación de cordura cuando se carga el script y tome una decisión a partir de eso.

Como la especificación no requiere un comportamiento particular en ese sentido, no es inmune a cambios posteriores, incluso dentro de la misma línea de navegador.

Puede enviar un parche a http://www.browserscope.org/ para incluir dichas pruebas en su suite. Pero, una vez más, la detección de funciones es superior a la detección del navegador.


Caso de prueba simple (ignore el encabezado, el segundo conjunto de números debe ser secuencial si la clasificación del motor es estable).

El tipo de IE ha sido estable siempre y cuando lo haya usado alguna vez (así que IE6). Comprobando nuevamente en IE8 y parece ser el caso.

Y aunque esa página de Mozilla con la que enlazas dice que el género de Firefox es estable, definitivamente digo que esto no siempre fue el caso antes (e incluido) de Firefox 2.0.

Algunos resultados superficiales:

  • IE6 +: estable
  • Firefox <3: inestable
  • Firefox> = 3: estable
  • Chrome <= 5 (es decir, todas las versiones hasta la fecha): inestable
  • Opera <10: inestable
  • Opera> = 10: estable
  • Safari 4: estable

Todas las pruebas en Windows.

Ver también:


Me gustaría compartir un truco que utilizo rutinariamente en C / C ++ para qsort() .

JS ''sort () permite especificar una función de comparación. Cree una segunda matriz de la misma longitud y llénela con números crecientes desde 0.

function stableSorted(array, compareFunction) { compareFunction = compareFunction || defaultCompare; var indicies = new Array(array.length); for (var i = 0; i < indicies.length; i++) indicies[i] = i;

Estos son índices en la matriz original. Vamos a ordenar el segundo conjunto. Haga una función de comparación personalizada.

indicies.sort(function(a, b)) {

Obtendrá los dos elementos de la segunda matriz: úselos como índices en las matrices originales y compare los elementos.

var aValue = array[a], bValue = array[b]; var order = compareFunction(a, b); if (order != 0) return order;

Si los elementos son iguales, entonces compare sus índices para hacer que el orden sea estable.

if (a < b) return -1; else return 1; });

Después de sort (), la segunda matriz contendría índices que puede usar para acceder a los elementos de la matriz original en orden ordenado estable.

var sorted = new Array(array.length); for (var i = 0; i < sorted.length; i++) sorted[i] = array[indicies[i]]; return sorted; } // The default comparison logic used by Array.sort(), if compareFunction is not provided: function defaultCompare(a, b) { a = String(a); b = String(b); if (a < b) return -1; else if (a > b) return 1; else return 0; }

En general, los algoritmos de ordenación estables solo están madurando y aún requieren más memoria extra en comparación con el buen ol ''qsort. Supongo que es por eso que muy pocas especificaciones ordenan un orden estable.