【问题标题】:Javascript How to scale Array, prevent errors from undefinedJavascript如何缩放数组,防止未定义的错误
【发布时间】:2014-07-25 14:10:13
【问题描述】:

我目前正在流星中创建一个测验应用程序。我使用的关键变量之一称为 currentQuestions,它跟踪用户参加的每个测验的问题编号。它目前是一个数组,每次用户单击特定测验的下一步或后退按钮时都会更新(在 Meteor 会话中)。例如:

   currentQuestion = Session.get('currentQuestion') || [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

这适用于少量测验。但是,当我想要进行大量测验时,您会建议什么?目前,当我创建的测验数量超过我之前在 currenQuestion 数组中定义的数量时,应用程序就会崩溃。

我想到的可能的解决方案

  1. (丑陋的解决方案)创建一个 for 循环,在启动时用大量零填充 currentQuestion 数组。

  2. 将一个对象插入到 mongoDB 数据库中,该数据库包含当前问题和所参加测验的 id(因此完全摆脱了数组)

希望您能提供帮助。

【问题讨论】:

    标签: javascript arrays mongodb meteor


    【解决方案1】:

    选项2绝对是正确的:

    如果您不需要跟踪会话之间的分数,您可以只使用客户端专用数据库并按照您的建议存储对象,并且只需几行新代码即可灵活的结果。

    这也将很容易转换为持久存储:使用 Meteor 的帐户包添加登录,将当前 userId 添加到每个测验对象,然后仅发布具有相同 @ 的测验对象987654322@作为登录用户。或者,如果您想完全避免用户登录,您甚至可以使用 amplify 包在给定浏览器中存储会话之间的结果(您必须在启动时再次提取现有结果,但这很容易)。

    结果将具有内置 Session 变量的所有反应性,并且将避免使用任意数量的零填充数组 - 只需检查具有给定测验 ID 的文档是否在集合中与否,如果没有,则创建它。

    【讨论】:

    • 感谢您的快速回答!你建议我怎么做?我现在有一个包含数组的 UserData 集合。我如何将其转换为具有用户 ID 的测验对象?我猜你在 UserData 中有一个测验对象,其中包含每个测验 id 和相关的当前问题。我有点迷失了如何在我的 mongodb 中准确地创建这样一个额外的层
    • 不看代码描述有点困难。但是,与其在 UserData 文档中包含对象,我将拥有一个完全独立的 QuizData 集合,其中包含包含 userIdquizIdscore 的文档(或者存储在目前阵列)。然后对于登录用户,您可以在服务器端通过userId 过滤(即find)文档并通过Meteor.publish 返回这些文档,以便登录用户只能看到他们自己的分数,即使它们都保存在同一个集合中。
    【解决方案2】:

    您需要完全摆脱数组。如果您要在会话之间跟踪,那么您需要使用 mongoDB 之类的东西。您可以创建进度或完成模型之类的东西,它可以保存有关他们参加的测验和每个测验的进度的信息。一旦你通过一些与用户 ID 相关的键来存储它们。

    您的肮脏解决方案并不是最糟糕的,因为您一开始就会知道您将有多少测验,然后可以分配数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 1970-01-01
      • 2019-03-30
      • 2011-08-16
      • 1970-01-01
      • 2022-06-28
      • 1970-01-01
      相关资源
      最近更新 更多