Вопрос или проблема
У меня есть данные, сгруппированные по ключу ‘groupname’… когда я сортирую с помощью кнопки заголовка по другому ключу, я хочу сортировать внутри групп, но не хочу, чтобы группы сортировались. Я пробовал несколько способов, таких как повторная сортировка значений по группам в соответствующих событиях (datasorted, datasortin, но ничего не работает …) Есть идеи, как это реализовать?
Мне удалось сделать это в старых версиях вот так
dataSorted: function (datas, sortList, dir, ctx, activedata) {
// console.log(datas);
if (sortList[0] && sortList[0].field.field != "GroupName") {
groups = _.groupBy(activedata, 'GroupName');
groups = _.sortBy(groups, function (grp) {
return grp[0].GroupName
});
var result = [];
// var vehics = Object.values(groups);
var vehics = Object.keys(groups).map(function (e) {
return groups[e]
});
for (var i = 0; i < vehics.length; i++) {
for (var j = 0; j < vehics[i].length; j++) {
result.push(vehics[i][j]);
}
}
// activedata = result;
//ctx.data = datas;
ctx.activeData = result;
}
но не могу реализовать это в новых версиях....
Ответ или решение
Проблема сортировки с использованием Tabulator и группированных значений
Сортировка данных в библиотеке Tabulator может быть сложной задачей, особенно когда требуется поддерживать структуру группировки при сортировке по другим полям. В вашем случае необходимо сортировать элементы внутри групп, не затрагивая сами группы. В этой статье мы рассмотрим подходы к решению этой задачи на примере кода, который вы использовали в предыдущих версиях и который не работает в новых.
Понимание структуры данных
Ваши данные сгруппированы по ключу 'GroupName'. Это означает, что каждый элемент имеет соответствующую группу, и вы хотите поддерживать порядок самих групп, сохранив при этом возможность сортировки значений внутри этих групп.
Основные моменты
-
Подход к сортировке: В новой версии Tabulator структура данных и обработка событий сортировки могли изменяться. Вам необходимо будет адаптировать свой подход к обработке событий сортировки.
-
Переменная
activedata
: Убедитесь, что вы правильно используете переменнуюactivedata
, которая содержит текущие активные данные перед сортировкой. -
Обработка событий сортировки: Использовать событие
dataSorted
для реорганизации данных после стандартной сортировки Tabulator.
Решение проблемы
Попробуем адаптировать ваш код к новой версии Tabulator. Мы будем переопределять поведение сортировки для элементов внутри групп, не изменяя порядок самих групп.
dataSorted: function(datas, sortList, dir, ctx, activedata) {
if (sortList[0] && sortList[0].field.field !== "GroupName") {
// Группировка данных по 'GroupName'
let groups = _.groupBy(activedata, 'GroupName');
// Создание массива для результата
let result = [];
// Сортировка значений внутри каждой группы
for (let groupName in groups) {
let groupItems = groups[groupName];
// Сортируем элементы внутри группы по выбранному полю
groupItems = _.sortBy(groupItems, function(item) {
return item[sortList[0].field.field];
});
// Добавляем отсортированные элементы группы в результат
result = result.concat(groupItems);
}
// Обновление активных данных в контексте
ctx.activeData = result;
}
}
Объяснение кода
- Группировка данных:
_.groupBy(activedata, 'GroupName')
используется для группировки данных по имени группы. - Сортировка внутри группы: Мы применяем
_.sortBy
для сортировки элементов внутри каждой группы на основе выбранного поля. - Сборка результата: Каждый отсортированный массив групп добавляется к
result
. - Обновление активных данных: Наконец, мы обновляем
ctx.activeData
, чтобы отобразить новые отсортированные данные.
Заключение
Проблема с сортировкой внутри групп в библиотеке Tabulator требует точного управления: необходимо удостовериться, что порядок групп остается неизменным, в то время как элементы внутри этих групп сортируются. Использование верного подхода к обработке события dataSorted
может значительно упростить эту задачу.
Перед внедрением данного кода убедитесь, что у вас установлены все необходимые библиотеки, такие как lodash, для выполнения операций группировки и сортировки. Если у вас есть дополнительные вопросы или вам нужна помощь с другими аспектами разработки, не стесняйтесь обращаться!