JavaScript中基于多字段排序课程类数据的进阶实现咨询
结构化数据高效排序方案
需求说明
我有一组包含课程(course)、章节(chapter)、**课时(lesson)**三种类型的结构化数据,排序要求如下:
- 第一优先级:按
type字段排序,固定顺序为 course → chapter → lesson - 第二优先级:同类型内按
sequence字段排序,同时章节要跟随所属课程的顺序,课时要跟随所属课程、章节的顺序
目前只实现了按type排序,想要一种不用拆分数据到不同变量再合并的高效排序方法。
示例数据
[ { "id": "course1", "type": "course", "sequence": 1 }, { "id": "course2", "type": "course", "sequence": 2 }, { "id": "course1_chapter1", "type": "chapter", "sequence": 1, "course": { "id": "course1", "sequence": 1 } }, { "id": "course1_chapter2", "type": "chapter", "sequence": 2, "course": { "id": "course1", "sequence": 1 } }, { "id": "course2_chapter1", "type": "chapter", "sequence": 1, "course": { "id": "course1", "sequence": 2 } }, { "id": "course1_chapter1_lesson1", "type": "lesson", "sequence": 1, "course": { "id": "course1", "sequence": 1 }, "chapter": { "id": "chapter1", "sequence": 1 } }, { "id": "course1_chapter1_lesson2", "type": "lesson", "sequence": 2, "course": { "id": "course1", "sequence": 1 }, "chapter": { "id": "chapter1", "sequence": 1 } }, { "id": "course1_chapter2_lesson1", "type": "lesson", "sequence": 1, "course": { "id": "course1", "sequence": 1 }, "chapter": { "id": "chapter1", "sequence": 2 } } ]
期望排序结果
course1, course2, course1_chapter1, course1_chapter2, course2_chapter1, course1_chapter1_lesson1, course1_chapter1_lesson2, course1_chapter2_lesson1
解决方案
核心思路
给三种类型定义优先级权重,排序时先按权重比较类型,再按层级的sequence字段递进排序:
- course → 权重0,直接比较自身
sequence - chapter → 权重1,先比较所属课程的
sequence,再比较自身sequence - lesson → 权重2,先比较所属课程的
sequence,再比较所属章节的sequence,最后比较自身sequence
代码实现(以JavaScript为例)
// 定义类型优先级映射 const typePriority = { course: 0, chapter: 1, lesson: 2 }; // 自定义排序函数 const sortCourseData = (a, b) => { // 第一步:比较类型优先级 const typeDiff = typePriority[a.type] - typePriority[b.type]; if (typeDiff !== 0) { return typeDiff; } // 第二步:按层级sequence递进比较 if (a.type === 'course') { return a.sequence - b.sequence; } if (a.type === 'chapter') { const courseSeqDiff = a.course.sequence - b.course.sequence; if (courseSeqDiff !== 0) return courseSeqDiff; return a.sequence - b.sequence; } if (a.type === 'lesson') { const courseSeqDiff = a.course.sequence - b.course.sequence; if (courseSeqDiff !== 0) return courseSeqDiff; const chapterSeqDiff = a.chapter.sequence - b.chapter.sequence; if (chapterSeqDiff !== 0) return chapterSeqDiff; return a.sequence - b.sequence; } return 0; }; // 执行排序(用扩展运算符复制原数组,避免修改原数据) const sortedData = [...yourData].sort(sortCourseData); // 输出验证 console.log(sortedData.map(item => item.id).join(', '));
优势说明
- 无需拆分数据,直接在原生排序逻辑内完成多维度比较,代码简洁
- 时间复杂度和原生
sort一致,为O(n log n),效率最优 - 层级递进的比较逻辑完全匹配需求,保证了数据的层级顺序
内容的提问来源于stack exchange,提问作者Nuthan Gowda
相关产品推荐
相关产品推荐

