La seguente funzione ti permetterà di ordinare una matrice di oggetti su una o più proprietà, sia ascendenti (predefinite) o decrescenti su ciascuna proprietà, e ti permetterà di scegliere se eseguire o meno confronti tra maiuscole e minuscole. Per impostazione predefinita, questa funzione esegue ordinamenti senza distinzione tra maiuscole e minuscole.
Il primo argomento deve essere l'array che contiene gli oggetti. Gli argomenti successivi devono essere un elenco separato da virgole di stringhe che fanno riferimento alle diverse proprietà dell'oggetto da ordinare. L'ultimo argomento (che è facoltativo) è un valore booleano per scegliere se eseguire o meno ordinamenti con distinzione tra maiuscole e minuscole - utilizzare true
per ordinamenti con distinzione tra maiuscole e minuscole.
La funzione ordinerà ogni proprietà / chiave in ordine crescente per impostazione predefinita. Se si desidera una particolare chiave di ordinamento in ordine decrescente, poi invece passare in una matrice in questo formato: ['property_name', true]
.
Ecco alcuni esempi di utilizzo della funzione seguiti da una spiegazione (dove si homes
trova un array contenente gli oggetti):
objSort(homes, 'city')
-> ordina per città (crescente, sensibile al maiuscolo / minuscolo)
objSort(homes, ['city', true])
-> ordina per città (decrescente, sensibile al maiuscolo / minuscolo)
objSort(homes, 'city', true)
-> ordina per città quindi prezzo (crescente, maiuscolo / minuscolo )
objSort(homes, 'city', 'price')
-> ordina per città quindi prezzo (entrambi in ordine crescente, con distinzione tra maiuscole e minuscole)
objSort(homes, 'city', ['price', true])
-> ordina per città (crescente) quindi prezzo (decrescente), sensibile al maiuscolo / minuscolo)
E senza ulteriori indugi, ecco la funzione:
function objSort() {
var args = arguments,
array = args[0],
case_sensitive, keys_length, key, desc, a, b, i;
if (typeof arguments[arguments.length - 1] === 'boolean') {
case_sensitive = arguments[arguments.length - 1];
keys_length = arguments.length - 1;
} else {
case_sensitive = false;
keys_length = arguments.length;
}
return array.sort(function (obj1, obj2) {
for (i = 1; i < keys_length; i++) {
key = args[i];
if (typeof key !== 'string') {
desc = key[1];
key = key[0];
a = obj1[args[i][0]];
b = obj2[args[i][0]];
} else {
desc = false;
a = obj1[args[i]];
b = obj2[args[i]];
}
if (case_sensitive === false && typeof a === 'string') {
a = a.toLowerCase();
b = b.toLowerCase();
}
if (! desc) {
if (a < b) return -1;
if (a > b) return 1;
} else {
if (a > b) return -1;
if (a < b) return 1;
}
}
return 0;
});
} //end of objSort() function
Ed ecco alcuni dati di esempio:
var homes = [{
"h_id": "3",
"city": "Dallas",
"state": "TX",
"zip": "75201",
"price": 162500
}, {
"h_id": "4",
"city": "Bevery Hills",
"state": "CA",
"zip": "90210",
"price": 1000000
}, {
"h_id": "5",
"city": "new york",
"state": "NY",
"zip": "00010",
"price": 1000000
}, {
"h_id": "6",
"city": "Dallas",
"state": "TX",
"zip": "85000",
"price": 300000
}, {
"h_id": "7",
"city": "New York",
"state": "NY",
"zip": "00020",
"price": 345000
}];