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