Poniższa funkcja umożliwia sortowanie tablicy obiektów według jednej lub wielu właściwości, rosnąco (domyślnie) lub malejąco według każdej właściwości, i pozwala wybrać, czy mają być wykonywane porównania z uwzględnieniem wielkości liter. Domyślnie ta funkcja wykonuje sortowanie bez uwzględniania wielkości liter.
Pierwszym argumentem musi być tablica zawierająca obiekty. Kolejne argumenty muszą być listą ciągów oddzielonych przecinkami, które odwołują się do różnych właściwości obiektu do sortowania. Ostatni argument (który jest opcjonalny) jest wartością logiczną, która pozwala wybrać, czy sortować z true
uwzględnieniem wielkości liter, czy nie - użyj go do sortowania z uwzględnieniem wielkości liter.
Funkcja domyślnie posortuje każdą właściwość / klucz w porządku rosnącym. Jeśli chcesz konkretny klucz do sortowania w kolejności malejącej, a następnie zamiast przechodzić w tablicy w tym formacie: ['property_name', true]
.
Oto kilka przykładowych zastosowań funkcji, po których następuje wyjaśnienie (gdzie homes
jest tablicą zawierającą obiekty):
objSort(homes, 'city')
-> sortuj według miasta (rosnąco, z uwzględnieniem wielkości liter)
objSort(homes, ['city', true])
-> sortuj według miasta (malejąco, z uwzględnieniem wielkości liter)
objSort(homes, 'city', true)
-> sortowanie wg miasta wówczas cena (rosnąco, sprawa wrażliwa )
objSort(homes, 'city', 'price')
-> sortuj według miasta, a następnie ceny (zarówno rosnąco, z uwzględnieniem wielkości liter)
objSort(homes, 'city', ['price', true])
-> sortuj według miasta (rosnąco), a następnie ceny (malejąco), z uwzględnieniem wielkości liter)
I bez zbędnych ceregieli, oto funkcja:
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
A oto kilka przykładowych danych:
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
}];