2009-12-28 13 views
21

¿Hay alguna forma de ordenar una matriz con Chrome?¿Ordenar arreglo de Javascript con Chrome?


Usando la función de clasificación no funciona como se ve en este ejemplo:

var myArray = [1,4,5,3,2]; 

myArray.sort (function(a , b){ 
    return b>a 
}); 

for (var i = 0; i < myArray.length; i++) 
{ 
    document.write(myArray[i]) 
} 

Firefox/IE/Opera/Safri de salida: 54321

Chrome de salida: 53241

jsBin example


¡Gracias por su tiempo!

Respuesta

30

Esto parece estándar, devuelve un número negativo, positivo o cero.

myArray.sort (function(a , b){ 
    return a-b; 
}); 

http://www.w3schools.com/jsref/jsref_sort.asp

+0

misma solución no funciona al ordenar la fecha en un formato "mm/dd/aaaa" –

13

El comportamiento de Chrome es correcto :)

Los estándares de ECMA requieren la función de ser pasado para ordenar() para volver un número mayor que 0, a menos de 0 o igual a 0. Sin embargo, la función que ha definido devuelve verdadero/falso. Las normas ECMA establecen que para una función que no se comporta como se espera, la implementación depende del cliente.

Read this

3

creo, la razón correcta es aquí: Sorting an array of objects in Chrome, más específicamente, this post.

lectura que, si se siente la necesidad de implementar su propia función de clasificación matriz, puede echar un vistazo a la publicación: http://en.literateprograms.org/Merge_sort_%28JavaScript%29

+0

Llego un poco tarde a la fiesta aquí y perdóneme si no entiendo bien, pero el enlace que ha dado es sobre la estabilidad de Chrome ordena cuando varios elementos se evaluarán con el mismo rango. Pero ese no es el mismo problema que en el caso de la pregunta hecha aquí, donde cada elemento tiene un rango distinto. –

5

Debido a lo que cubre el estándar ECMA acerca de las matrices de clasificación (de una manera muy simplificada) :

  • Si en la comparación se recibe 1 A, desciende una posición.
  • Si recibe -1 mantener la posición y definir la clasificación superior hacia la B.
  • Si recibe 0 no hace nada.

La forma más segura de garantizar el mismo comportamiento en todos los navegadores es:

// descending order 
abc =[10,2,4,1]; 
abc.sort(function(a , b){ 
    return a > b ? -1 : 1; 
}); 

// ascending order 
abc.sort(function(a , b){ 
    return a > b ? 1 : -1; 
}); 

Para los objetos primitivos es Posible utilizar la versión corta

// descending order 
abc.sort(function(a , b){ 
    return b - a; 
}); 

// ascending order 
abc.sort(function(a , b){ 
    return a - b; 
}); 

de objetos como:

var items = [ 
     { name: 'Edward', value: 21 }, 
     { name: 'Sharpe', value: 27 }, 
     { name: 'And', value: 31 }, 
     { name: 'The', value: -12 }, 
     { name: 'Zeros', value: 37 }, 
     { name: 'Magnetic', value: 37 } 

La manera correcta es:

items.sort(function(a , b){ 
    var result = a == b ? 0 : b > a ? -1 : 1 
    if(result === 0) 
    { 
    // implement a tight break evaluation 
    } 
    return result ; 
    }); 

Este es el camino correcto porque la forma en que el navegador itera no está definida en el estándar ECMA y el navegador puede iterar de diferentes maneras. Por ejemplo, la mayoría de los navegadores iteran de arriba hacia abajo, pero Chrome itera el primer elemento con el último y sube el camino. Por lo tanto, en caso de un ajuste puede dar lugar a resultados diferentes de la mayoría de los navegadores.

Cuestiones relacionadas