2009-12-28 18 views
21

C'è un modo per ordinare un array usando Chrome?Ordinamento della matrice Javascript con Chrome?


Utilizzando la funzione di ordinamento non funziona come si vede in questo esempio:

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 uscita: 54321

Chrome uscita: 53241

jsBin example


Grazie per il vostro tempo!

risposta

30

Questo sembra standard, restituisce un numero negativo, positivo o zero.

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

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

+0

la stessa soluzione non funziona quando la data di ordinamento in tale formato "gg/mm/aaaa" –

13

Il comportamento di Chrome è corretto :)

Gli standard ECMA richiedono la funzione di essere passati per ordinare() per restituire un numero maggiore di 0, inferiore o uguale a 0 0. Tuttavia, la funzione definita dall'utente restituisce true/false. Gli standard ECMA stabiliscono che per una funzione che non si comporta come previsto, l'implementazione dipende dal cliente.

Read this

3

credo, la ragione corretta è qui: Sorting an array of objects in Chrome, più specificamente, this post.

Messaggio lettura che, se si sente la necessità di attuare la propria funzione di ordinamento di matrice, si può avere uno sguardo a: http://en.literateprograms.org/Merge_sort_%28JavaScript%29

+0

Sono un po 'in ritardo per la festa qui e perdonami se sto fraintendendo ma il collegamento che hai dato sta discutendo della stabilità di L'ordinamento di Chrome quando più elementi valuteranno allo stesso rango. Ma questo non è lo stesso problema del caso della domanda qui, in cui ogni articolo ha un rango distinto. –

5

causa di ciò che copre l'ECMA standard sugli array di ordinamento (in modo molto semplificato) :

  • Se nel confronto riceve 1 A discendere una posizione.
  • Se riceve -1 mantiene la posizione e definisce la posizione superiore verso B.
  • Se riceve 0 non fa nulla.

Il modo più sicuro per garantire lo stesso comportamento in tutti i browser è:

// 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; 
}); 

Per gli oggetti primitivi è posible di utilizzare la versione breve

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

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

per oggetti come:

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 } 

Il modo giusto è:

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

Questo è il modo giusto, perché il modo in cui le itera del browser non è definita nello standard ECMA e browser potrebbe iterare in modi diversi. Ad esempio la maggior parte dei browser eseguono l'iterazione dall'alto verso il basso, ma il cromo itera il 1 ° elemento con l'ultimo e aumenta la velocità. Quindi, in caso di uno stretto potrebbero risultare risultati diversi della maggior parte dei browser.

Problemi correlati