Наступна функція дозволить вам сортувати масив об’єктів за однією чи кількома властивостями, або за зростанням (за замовчуванням), або за спаданням для кожної властивості, і дозволить вам вибирати, чи слід проводити порівняння залежно від регістру чи ні. За замовчуванням ця функція виконує нечутливі регістри.
Першим аргументом повинен бути масив, що містить об'єкти. Наступні аргументи повинні бути розділеними комами списками рядків, які посилаються на різні властивості об'єкта для сортування. Останній аргумент (який є необов'язковим) - це булевий спосіб вибору, чи слід виконувати сортування, залежне від регістру, чи ні - використовувати true
для сортування залежно від регістру.
Функція буде сортувати кожне властивість / ключ у порядку зростання за замовчуванням. Якщо ви хочете конкретний ключ сортування в порядку убування, то замість того, щоб передати масив в наступному форматі: ['property_name', true]
.
Ось деякі приклади використання функції з подальшим поясненням (де homes
масив, що містить об'єкти):
objSort(homes, 'city')
-> сортувати за містами (за зростанням, з урахуванням регістру)
objSort(homes, ['city', true])
-> сортувати за містом (за убуванням, з урахуванням регістру)
objSort(homes, 'city', true)
-> сортувати за містом, тоді ціну (за зростанням, залежно від регістру )
objSort(homes, 'city', 'price')
-> сортувати за містом, а потім за ціною (як в порядку зростання, так і в регістрі)
objSort(homes, 'city', ['price', true])
-> сортувати за містом (за зростанням), а потім за ціною (у зменшенні), з урахуванням регістру)
І без подальшої приналежності, ось ця функція:
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
Ось кілька прикладних даних:
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
}];