如何按规则排序TableColumns数组:checkbox优先,status次之
表格列排序逻辑修正需求与解决方案
需求概述
需要实现表格列数组的排序规则,同时同步更新列的_order字段:
- 仅存在
status列时,该列排第一,_order设为0 - 同时存在
checkbox和status列时,checkbox排第一(_order=0)、status排第二(_order=1) - 仅存在
checkbox列时,该列排第一,_order设为0 - 其他列按原有名称排序逻辑排列,
_order按排序后的顺序设置
现有代码问题
当前的排序逻辑条件判断混乱,没有明确区分checkbox和status的优先级关系,无法满足需求,代码如下:
config.tableColumns.sort((a, b) => { if ((a.Key.toLowerCase() == 'checkbox' && a.Key.toLowerCase()!= 'status') || (a.Key.toLowerCase()!= 'checkbox' && a.Key.toLowerCase() == 'status')) { return -1; } if (a.Key.toLowerCase()!= 'checkbox' && a.Key.toLowerCase()!= 'status') { return 1; } const nameA = a.Key || ''; const nameB = b.Key || ''; return nameA.localeCompare(nameB); });
修正后的实现代码
1. 排序数组顺序
config.tableColumns.sort((a, b) => { // 为列定义优先级:checkbox(最高) > status > 其他列 const getColumnPriority = (column) => { const key = column.Key?.toLowerCase() || ''; switch(key) { case 'checkbox': return 1; case 'status': return 2; default: return 3; } }; const priorityA = getColumnPriority(a); const priorityB = getColumnPriority(b); // 优先级高的列排在前面 if (priorityA !== priorityB) { return priorityA - priorityB; } // 优先级相同的列,按名称字典序排序 const nameA = a.Key || ''; const nameB = b.Key || ''; return nameA.localeCompare(nameB); });
2. 更新_order字段
排序完成后,遍历数组设置对应列的_order值:
config.tableColumns.forEach((column, index) => { const key = column.Key?.toLowerCase(); if (key === 'checkbox') { column._order = 0; } else if (key === 'status') { column._order = 1; } else { // 其他列的_order从2开始按排序后的顺序递增,可根据需求调整 column._order = index >= 2 ? index : index + 2; } });
逻辑说明
- 优先级定义:通过
getColumnPriority函数明确列的优先级,确保checkbox始终排在status之前,两者都优先于其他列 - 排序逻辑:先比较优先级,优先级差异决定排列顺序;优先级相同时,按列名的字典序排序,保留原有逻辑
- _order更新:单独遍历设置特殊列的
_order值,其他列按排序后的位置设置,保证顺序与显示一致
内容的提问来源于stack exchange,提问作者Karim
相关产品推荐
相关产品推荐

