Come ordinare una matrice di numeri interi correttamente

Cercando di ottenere il valore più alto e più basso da una matrice che conosco conterrà solo interi, sembra essere più difficile di quanto pensassi.

var numArray = [140000, 104, 99]; numArray = numArray.sort(); alert(numArray) 

Mi aspetto che questo mostri 99, 104, 140000 . Invece mostra 104, 140000, 99 . Quindi sembra che l’ordinamento stia gestendo i valori come stringhe.

C’è un modo per ottenere la funzione di ordinamento per ordinare effettivamente il valore intero?

Per impostazione predefinita, il metodo sort ordina gli elementi in ordine alfabetico. Per ordinare numericamente basta aggiungere un nuovo metodo che gestisce gli ordinamenti numerici (sortNumber, mostrato sotto) –

 function sortNumber(a,b) { return a - b; } var numArray = [140000, 104, 99]; numArray.sort(sortNumber); alert(numArray.join(",")); 

MODIFICA: utilizzando le funzioni freccia ES6:

 numArray.sort((a, b) => a - b); // For ascending sort numArray.sort((a, b) => b - a); // For descending sort 

Basandosi su tutte le risposte di cui sopra, possono anche essere fatte in una riga come questa:

 var numArray = [140000, 104, 99]; // ES5 numArray = numArray.sort(function (a, b) { return a - b; }); // ES2015 numArray = numArray.sort((a, b) => a - b); //outputs: 99, 104, 140000 

array.sort esegue un ordinamento lessicografico per impostazione predefinita, per un ordinamento numerico, fornisce la propria funzione. Ecco un semplice esempio:

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

Si noti inoltre che ordinamento funziona “sul posto”, non è necessario per l’assegnazione.

Questa risposta equivale ad alcune delle risposte esistenti, ma le funzioni di freccia di ECMAScript 6 forniscono una syntax molto più compatta che ci consente di definire una funzione di ordinamento in linea senza sacrificare la leggibilità:

 numArray = numArray.sort((a, b) => a - b); 

Oggi è supportato nella maggior parte dei browser .

Sono d’accordo con gli ak, invece di usare

 return a - b; 

Dovresti usare

 return a > b ? 1 : a < b ? -1 : 0; 

In JavaScript, il comportamento predefinito del metodo sort () è di ordinare i valori in una matrice alfabeticamente.

Per ordinare per numero devi definire una funzione di ordinamento numerico (che è molto semplice):

 ... function sortNumber(a, b) { return a - b; } numArray = numArray.sort(sortNumber); 

Array.prototype.sort () è il metodo go per ordinare gli array, ma ci sono un paio di problemi di cui dobbiamo essere consapevoli.

L’ordine di ordinamento è per impostazione predefinita lessicografico e non numerico indipendentemente dai tipi di valori nell’array. Anche se la matrice è tutti i numeri, tutti i valori saranno convertiti in stringa e ordinati lessicograficamente.

Quindi dovremmo avere bisogno di personalizzare il metodo sort () e reverse () come sotto.

URL referito

Per ordinare i numeri all’interno dell’array

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

Per inversione dei numeri all’interno dell’array

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

URL referito

Il motivo per cui la funzione di ordinamento si comporta in modo strano

Dalla documentazione :

[…] la matrice viene ordinata in base al valore del punto di codice Unicode di ciascun carattere, in base alla conversione della stringa di ciascun elemento.

Se si stampano i valori dei punti Unicode dell’array, questo si chiarirà.

 console.log("140000".charCodeAt(0)); console.log("104".charCodeAt(0)); console.log("99".charCodeAt(0)); //Note that we only look at the first index of the number "charCodeAt( 0 )" 

La domanda è già stata risolta, il modo più breve è usare il metodo sort() . Ma se stai cercando altri modi per ordinare la tua serie di numeri, e ami anche i cicli, controlla quanto segue

Inserimento sort

Ascendente:

 var numArray = [140000, 104, 99]; for (var i = 0; i < numArray.length; i++) { var target = numArray[i]; for (var j = i - 1; j >= 0 && (numArray[j] > target); j--) { numArray[j+1] = numArray[j]; } numArray[j+1] = target } console.log(numArray); 

Solo per un normale array di valori di elementi:

 function sortArrayOfElements(arrayToSort) { function compareElements(a, b) { if (a < b) return -1; if (a > b) return 1; return 0; } return arrayToSort.sort(compareElements); } eg 1: var array1 = [1,2,545,676,64,2,24] **output : [1, 2, 2, 24, 64, 545, 676]** var array2 = ["v","a",545,676,64,2,"24"] **output: ["a", "v", 2, "24", 64, 545, 676]** 

Per una serie di oggetti:

 function sortArrayOfObjects(arrayToSort, key) { function compareObjects(a, b) { if (a[key] < b[key]) return -1; if (a[key] > b[key]) return 1; return 0; } return arrayToSort.sort(compareObjects); } eg 1: var array1= [{"name": "User4", "value": 4},{"name": "User3", "value": 3},{"name": "User2", "value": 2}] **output : [{"name": "User2", "value": 2},{"name": "User3", "value": 3},{"name": "User4", "value": 4}]** 

Prova questo codice come di seguito

 var a = [5, 17, 29, 48, 64, 21]; function sortA(arr) { return arr.sort(function(a, b) { return a - b; }) ;} alert(sortA(a)); 

Aggiornare! Scorri fino alla fine della risposta per l’additivo per smartSort che offre ancora più divertimento!
Ordina array di qualsiasi cosa !

La mia forma preferita personale di questa funzione consente un parametro per Crescente o Decrescente:

 function intArraySort(c, a) { function d(a, b) { return b - a; } "string" == typeof a && a.toLowerCase(); switch (a) { default: return c.sort(function(a, b) { return a - b; }); case 1: case "d": case "dc": case "desc": return c.sort(d) } }; 

Uso semplice come:

 var ara = function getArray() { var a = Math.floor(Math.random()*50)+1, b = []; for (i=0;i< =a;i++) b.push(Math.floor(Math.random()*50)+1); return b; }(); // Ascending intArraySort(ara); console.log(ara); // Descending intArraySort(ara, 1); console.log(ara); // Ascending intArraySort(ara, 'a'); console.log(ara); // Descending intArraySort(ara, 'dc'); console.log(ara); // Ascending intArraySort(ara, 'asc'); console.log(ara); 

jsFiddle


O esempio di frammento di codice qui!

 function intArraySort(c, a) { function d(a, b) { return b - a } "string" == typeof a && a.toLowerCase(); switch (a) { default: return c.sort(function(a, b) { return a - b }); case 1: case "d": case "dc": case "desc": return c.sort(d) } }; function tableExample() { var d = function() { var a = Math.floor(50 * Math.random()) + 1, b = []; for (i = 0; i < = a; i++) b.push(Math.floor(50 * Math.random()) + 1); return b }, a = function(a) { var b = $(""), c = $("").prependTo(b); $("", { text: intArraySort(d(), a).join(", ") }).appendTo(b); switch (a) { case 1: case "d": case "dc": case "desc": c.addClass("desc").text("Descending"); break; default: c.addClass("asc").text("Ascending") } return b }; return $("tbody").empty().append(a(), a(1), a(), a(1), a(), a(1), a(), a(1), a(), a(1), a(), a(1)) }; tableExample(); 
 table { border-collapse: collapse; } th, td { border: 1px solid; padding: .25em .5em; vertical-align: top; } .asc { color: red; } .desc { color: blue } 
  

Prova questo codice:

HTML:

 

Codice JavaScript:

  

Ecco la mia funzione array di ordinamento nella libreria utils:

 sortArray: function(array) { array.sort(function(a, b) { return a > b; }); }, # Let's test a string array var arr = ['bbc', 'chrome', 'aux', 'ext', 'dog']; utils.sortArray(arr); console.log(arr); >>> ["aux", "bbc", "chrome", "dog", "ext", remove: function] # Let's test a number array var arr = [55, 22, 1425, 12, 78]; utils.sortArray(arr); console.log(arr); >>> [12, 22, 55, 78, 1425, remove: function] 

Modo semplice con ECMAScript 5:

 var arr = [16,17,18,2,22,23,24,25,26,27,3,4,5,6,7,8,9,1,10,11,13,14,15]; arr=arr.sort(function(a,b){return ab}); console.log(arr); 1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,22,23,24,25,26,27