You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 04:35:55