Funzione di ordinamento Javascript. Ordina per prima poi per seconda

Ho una matrice di oggetti da ordinare. Ogni object ha due parametri: Forza e Nome

objects = [] object[0] = {strength: 3, name: "Leo"} object[1] = {strength: 3, name: "Mike"} 

Voglio ordinare prima per forza e poi in ordine alfabetico. Sto usando il seguente codice per ordinare il primo parametro. Come posso ordinare dal secondo?

 function sortF(ob1,ob2) { if (ob1.strength > ob2.strength) {return 1} else if (ob1.strength < ob2.strength){return -1} return 0; }; 

Grazie per l’aiuto.

Espandi la tua funzione di ordinamento per essere così;

 function sortF(ob1,ob2) { if (ob1.strength > ob2.strength) { return 1; } else if (ob1.strength < ob2.strength) { return -1; } // Else go to the 2nd item if (ob1.name < ob2.name) { return -1; } else if (ob1.name > ob2.name) { return 1 } else { // nothing to split them return 0; } } 

Un confronto < e > su stringhe è un confronto alfabetico.

Questa piccola funzione è spesso utile quando si ordina in base a più chiavi:

 cmp = function(a, b) { if (a > b) return +1; if (a < b) return -1; return 0; } 

Applicalo in questo modo:

 array.sort(function(a, b) { return cmp(a.strength,b.strength) || cmp(a.name,b.name) }) 

Javascript manca davvero l' operatore di astronave di Ruby, che rende estremamente raffinati tali confronti.

È ansible concatenare l’ordinamento con OR logico.

 objects.sort(function (a, b) { return a.strength - b.strength || a.name.localeCompare(b.name); }); 

Quando stavo cercando una risposta a questa domanda, le risposte che ho trovato su StackOverflow non erano proprio ciò che speravo. Così ho creato una funzione semplice e riutilizzabile che fa esattamente questo. Ti permette di usare lo standard Array.sort, ma con lo stile firstBy (). ThenBy (). ThenBy (). https://github.com/Teun/thenBy.js

PS. Questa è la seconda volta che pubblico questo post. La prima volta è stata rimossa da un moderatore che diceva “Per favore non creare post promozionali per il proprio lavoro”. Non sono sicuro di quali siano le regole qui, ma stavo cercando di rispondere a questa domanda. Mi dispiace molto che sia il mio lavoro. Sentiti libero di rimuoverlo, ma per favore indicami la regola in questione.

 function sortF(ob1,ob2) { if (ob1.strength > ob2.strength) {return 1} else if (ob1.strength < ob2.strength) {return -1} else if (ob1.name > ob2.name) {return 1} return -1; }; 

EDIT: Ordina per forza, quindi se la forza è uguale, ordina per nome. Il caso in cui forza e nome sono uguali in entrambi gli oggetti non ha bisogno di essere contabilizzato separatamente, dal momento che il ritorno finale di -1 indica una relazione minore o uguale a. Il risultato del tipo sarà corretto. Potrebbe farlo girare più veloce o più lentamente, non lo so. Se vuoi essere esplicito, basta sostituire

 return -1; 

con

 else if (ob1.name < ob2.name) {return -1} return 0; 

Trova la funzione ‘sortFn’ sotto. Questa funzione ordina un numero illimitato di parametri (ad esempio in c #: SortBy (…). ThenBy (…). ThenByDesc (…)).

 function sortFn() { var sortByProps = Array.prototype.slice.call(arguments), cmpFn = function(left, right, sortOrder) { var sortMultiplier = sortOrder === "asc" ? 1 : -1; if (left > right) { return +1 * sortMultiplier; } if (left < right) { return -1 * sortMultiplier; } return 0; }; return function(sortLeft, sortRight) { // get value from object by complex key var getValueByStr = function(obj, path) { var i, len; //prepare keys path = path.replace('[', '.'); path = path.replace(']', ''); path = path.split('.'); len = path.length; for (i = 0; i < len; i++) { if (!obj || typeof obj !== 'object') { return obj; } obj = obj[path[i]]; } return obj; }; return sortByProps.map(function(property) { return cmpFn(getValueByStr(sortLeft, property.prop), getValueByStr(sortRight, property.prop), property.sortOrder); }).reduceRight(function(left, right) { return right || left; }); }; } var arr = [{ name: 'marry', LocalizedData: { 'en-US': { Value: 10000 } } }, { name: 'larry', LocalizedData: { 'en-US': { Value: 2 } } }, { name: 'marry', LocalizedData: { 'en-US': { Value: 100 } } }, { name: 'larry', LocalizedData: { 'en-US': { Value: 1 } } }]; document.getElementsByTagName('pre')[0].innerText = JSON.stringify(arr) arr.sort(sortFn({ prop: "name", sortOrder: "asc" }, { prop: "LocalizedData[en-US].Value", sortOrder: "desc" })); document.getElementsByTagName('pre')[1].innerText = JSON.stringify(arr) 
 pre { font-family: "Courier New" Courier monospace; white-space: pre-wrap; } 
 Before: 

Result:


Con ES6 puoi fare

 array.sort(function(a, b) { return SortFn(a.strength,b.strength) || SortFn(a.name,b.name) }) private sortFn(a, b): number { return a === b ? 0 : a < b ? -1 : 1; }