如何按sortPriority指定的level优先级对对象数组排序并按data升序排列?
自定义优先级排序并渲染列表
问题分析
你现有的排序逻辑完全没用到sortPriority的自定义顺序,只是单纯按level字典序和data升序两次排序,根本满足不了"按指定字符顺序排level、不在序列的level放末尾"的需求。
解决方案
直接写一个符合要求的排序函数,一次完成两个排序规则:
- 先按
sortPriority中的字符顺序对level排序,不在序列中的level自动排到最后 - 同一
level的元素,按data属性升序排列
修改后的完整代码
const sortPriority = "ramoklyxq"; const list = document.getElementById('holder'); // 定义优先级获取函数:返回level在sortPriority中的索引,不在则返回一个大值(确保排最后) const getLevelPriority = (level) => { const index = sortPriority.indexOf(level); return index === -1 ? sortPriority.length : index; }; // 对列表子节点排序后重新追加 [...list.children] .sort((a, b) => { // 先比较level的优先级 const priorityA = getLevelPriority(a.data.level); const priorityB = getLevelPriority(b.data.level); if (priorityA !== priorityB) { return priorityA - priorityB; } // 同level则按data升序:如果是数字用减法,字符串用localeCompare if (typeof a.data.data === 'number') { return a.data.data - b.data.data; } else { return a.data.data.localeCompare(b.data.data); } }) .forEach(node => list.appendChild(node));
代码说明
getLevelPriority函数:把不在sortPriority里的level的优先级设为sortPriority.length,这样所有不在序列里的level都会排在指定顺序的元素之后- 排序逻辑:先按level优先级排序,优先级小的(在sortPriority里位置靠前的)排前面;优先级相同的情况下,再按data的数值/字符串升序排列
- 不需要嵌套循环,一次排序就能完成所有需求,效率比你原来的两次循环高得多
内容的提问来源于stack exchange,提问作者user2730288
相关产品推荐
相关产品推荐

