В библиотеке Muuri сортировка элементов сетки может быть выполнена двумя основными способами: стабильная и нестабильная. Понимание различий между ними критически важно при работе с динамическими сетками, где элементы могут перемещаться, добавляться или удаляться.
Стабильная сортировка гарантирует сохранение
исходного порядка элементов с одинаковыми значениями критерия
сортировки. В Muuri это означает, что если два элемента имеют одинаковый
ключ сортировки, их относительное положение останется неизменным после
применения метода sort().
const grid = new Muuri('.grid', {
layout: {
rounding: false
}
});
// Сортировка по data-атрибуту "priority"
grid.sort((itemA, itemB) => {
return itemA.getElement().dataset.priority - itemB.getElement().dataset.priority;
}, { stable: true });
В этом примере элементы с одинаковым значением priority
сохранят свой первоначальный порядок в DOM. Это особенно важно при
визуализации контента, где порядок элементов несет смысловую нагрузку,
например, при отображении задач в списке по приоритету.
Ключевые особенности стабильной сортировки в Muuri:
{ stable: true } в методе
sort().Нестабильная сортировка в Muuri работает быстрее, поскольку не гарантирует сохранение исходного порядка для элементов с одинаковыми ключами. При больших объемах элементов это может заметно ускорить процесс сортировки, но визуальный порядок элементов может меняться даже при одинаковых значениях критерия.
grid.sort((itemA, itemB) => {
return itemA.getElement().dataset.priority - itemB.getElement().dataset.priority;
});
Здесь сортировка будет выполнена без сохранения порядка между
элементами с одинаковым priority. Это подходит для
динамических интерфейсов, где скорость обновления важнее визуальной
консистентности.
Преимущества нестабильной сортировки:
Сортировка карточек задач:
Если карточки имеют поле priority, стабильная сортировка
гарантирует, что задачи с одинаковым приоритетом не «прыгают» после
обновления сетки.
grid.sort((a, b) => {
return a.getElement().dataset.priority - b.getElement().dataset.priority;
}, { stable: true });Динамическая фильтрация:
При фильтрации элементов и последующей сортировке нестабильная сортировка ускоряет процесс, так как Muuri не тратит ресурсы на сохранение исходного порядка.
Смешанные кейсы:
Можно комбинировать подходы: стабильная сортировка для статических категорий и нестабильная для временно обновляемого контента.
Метод sort() принимает два параметра:
grid.sort(compareFunction?: (a: MuuriItem, b: MuuriItem) => number, options?: { stable: boolean });
compareFunction — функция сравнения элементов.
Возвращает отрицательное число, ноль или положительное число.options.stable — логическое значение, включающее
стабильную сортировку. По умолчанию false.Пример комплексного использования:
grid.sort((a, b) => {
const typeA = a.getElement().dataset.type;
const typeB = b.getElement().dataset.type;
if (typeA === typeB) {
return a.getElement().dataset.order - b.getElement().dataset.order;
}
return typeA.localeCompare(typeB);
}, { stable: true });
В этом примере сначала элементы сортируются по типу, а затем, при
совпадении типа, по полю order. Опция
stable: true гарантирует, что порядок элементов с
одинаковым типом будет предсказуемым.
Использование оптимизированных функций сравнения и выбор правильного типа сортировки позволяет балансировать между скоростью и визуальной консистентностью.
Правильное использование стабильной и нестабильной сортировки обеспечивает удобное управление сеткой Muuri и повышает эффективность взаимодействия с DOM.