通过阅读文本部分来跟踪用户进度的最佳方法

Best method to keep track of a users progression through reading sections of text

zyBooks类似,如果您熟悉它,我想跟踪用户已阅读并通过按钮检查完成的部分。

但是,从概念上讲,除了包含每个部分和 bool 值的对象或对象数组之外,我无法考虑在我的 mongo 数据库中存储什么来跟踪它们的进度。一个部分将有大约 10 个小节。但是总共会有大约 8 个部分。所以总共要跟踪 80 个小节。

这就是我的想法,但似乎效率低下。

const sectionArray = [
  {
    section: "1",
    completed: false,
    subsections: [
      {
        name: "1.1",
        completed: false,
      },
      {
        name: "1.2",
        completed: false,
      },
      {
        name: "1.3",
        completed: false,
      },
    ],
  },
  {
    section: "2",
    completed: false,
    subsections: [
      {
        name: "2.1",
        completed: false,
      },
      {
        name: "2.2",
        completed: false,
      },
      {
        name: "2.3",
        completed: false,
      },
    ],
  },
...
];

我还将根据用户决定使用 React 和 material ui.

来显示一个部分及其子部分的内容

如果有更好的选择,我不想采用我的方法。

我认为您的方法完全适用于该数据量。

问题是,“低效”是什么意思?

从性能的角度来看,80个元素完全没问题。也许您只是对处理该代码感觉不舒服(这是一个正当理由)。

另一种选择是:

const sectionArray = [
  { section: "1", completed: false },
  { section: "1.1", completed: false },
  { section: "1.2", completed: false },
]

或(更快地访问这些部分,例如没有 .find()):

const sectionCollection = {
  "1": false,
  "1.1": false,
  "1.2": false,
]

也许你不需要存储主要部分,如果它们在所有子部分完成时隐式完成?

const sectionCollection = { 
  "1.1": false,  // "1" is implicitly done if all "1.x" are done
  "1.2": false,
]

可能不是一个合适的替代方案(如果大多数项目可能总是 false 会更有效):

const sectionArray = [ "1", "1.3", "3.2" ] // 1, 1.3, 3.2 are 'true', all others are 'false'

只是为了好玩:您也可以使用整数作为部分 ID(这在错误的一端可笑地过度优化):

const sectionCollection = [ 100, 103, 302 ]    // list of integers
const sectionCollection = [ 0x10, 0x13, 0x32 ] // using hex or bin
const sectionCollection = { [100]: false, [101]: true } // integer keys

然后甚至存储一个字节数组而不是 JSON。