Необходимо изменить только функцию компаратора сортировки.Я уверен, что для этого есть плагины, и вы, возможно, захотите взглянуть на них, но реализовать то, что вы хотите, довольно тривиально.Метод sortDescending
каждый раз получает два деления, и сравнение должно соответствовать заданным вами критериям:
- Сначала по количеству
- Если число равно, то по отметке времени
- Если временные метки равны, то вернуть 0
Вот ужасно простая неоптимизированная версия:
function sortDescending(a, b) {
if(getCount(a) < getCount(b)) {
return -1;
}
else if(getCount(a) > getCount(b)) {
return 1;
}
else if(getTimestamp(a) < getTimestamp(b)) {
return -1;
}
else if(getTimestamp(a) > getTimestamp(b) {
return 1;
}
else {
return 0;
}
}
Если вы видите структуру if-else
, она можетКажется очевидным, что вы можете обобщить этот подход, чтобы иметь возможность обрабатывать любые типы пользовательских заказов.Итак, вот джеб в методе sortBy
, который принимает число функций обратного вызова, где каждый обратный вызов определяет один критерий сортировки.
function sortBy() {
var callbacks = arguments;
return function(a, b) {
for(var i = 0; i < callbacks; i++) {
var value = callbacks[i](a, b);
if(value != 0) {
return value;
}
}
return 0;
};
}
Затем передайте все критерии как обратные вызовы этой функции sortBy
.Вот грубый пример для вашего кода:
function compareCount(a, b) {
return getCount(a) - getCount(b);
}
function compareTimestamp(a, b) {
return getTimestamp(a) - getTimestamp(b);
}
$("selector").sort(sortBy(compareCount, compareTimestamp));
И пока мы это делаем, давайте также сделаем из этого плагин jQuery.Он будет иметь приятный и простой интерфейс:
$("parent selector").sortBy("child selector 1", "child selector 2", ...);
Идея состоит в том, чтобы передать селектор jQuery, который выберет узел, текст которого будет определять значение для сортировки.Мы дадим целым числам более высокий приоритет и сначала попробуем выполнить числовую сортировку, если оба значения таковы, в противном случае проведем регулярное сравнение.
jQuery.fn.sortBy = function() {
var selectors = arguments;
this.sort(function(a, b) {
// run through each selector, and return first non-zero match
for(var i = 0; i < selectors.length; i++) {
var selector = selectors[i];
var first = $(selector, a).text();
var second = $(selector, b).text();
var isNumeric = Number(first) && Number(second);
if(isNumeric) {
var diff = first - second;
if(diff != 0) {
return diff;
}
}
else if(first != second) {
return first < second ? -1 : 1;
}
}
return 0;
});
this.appendTo(this.parent());
return this;
};
Используйте как
$('#list .list_item').sortBy('.count', '.timestmap');
См. Пример плагина здесь .
Между прочим, ничего из этого на самом деле не отсортирует элементы в самом документе.См. Этот вопрос о том, как это сделать.