Следующая функция позволит вам отсортировать массив объектов по одному или нескольким свойствам, по возрастанию (по умолчанию) или по убыванию для каждого свойства, и позволит вам выбрать, выполнять ли сравнения с учетом регистра. По умолчанию эта функция выполняет сортировку без учета регистра.
Первым аргументом должен быть массив, содержащий объекты. Последующие аргументы должны представлять собой список строк, разделенных запятыми, которые ссылаются на различные свойства объекта для сортировки. Последний аргумент (который является необязательным) является логическим, чтобы выбрать, выполнять ли сортировку с учетом регистра - используйте 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
}];