Javascript如何缩放数组,防止未定义的错误

Javascript如何缩放数组,防止未定义的错误,javascript,arrays,mongodb,meteor,Javascript,Arrays,Mongodb,Meteor,我目前正在meteor中创建一个测验应用程序。我使用的一个关键变量叫做currentQuestions,它跟踪用户参加的每个测验的问题数。它目前是一个数组,每当用户单击某个特定测验上的“下一步”或“上一步”按钮时,它都会更新(在Meteor会话中)。例如: currentQuestion = Session.get('currentQuestion') || [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 这对于少量的测验很有效。但是,当我想做大量的测验时,你有什么建

我目前正在meteor中创建一个测验应用程序。我使用的一个关键变量叫做currentQuestions,它跟踪用户参加的每个测验的问题数。它目前是一个数组,每当用户单击某个特定测验上的“下一步”或“上一步”按钮时,它都会更新(在Meteor会话中)。例如:

   currentQuestion = Session.get('currentQuestion') || [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
这对于少量的测验很有效。但是,当我想做大量的测验时,你有什么建议?目前,当我创建的测验比我以前在currenQuestion数组中定义的测验更多时,应用程序崩溃

我想到的可能的解决办法

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

  • 将一个对象插入到mongoDB数据库中,该数据库包含currentquestion,其id为所做测验的id(因此完全删除该数组)


  • 希望你能帮忙

    您需要完全删除该数组。如果要在会话之间保持跟踪,则需要使用mongoDB之类的工具。你可以创建一些类似于进度或完成模型的东西,它可以保存关于他们参加的测验的信息以及每个测验的进度。一旦你有了它,它就会通过一些与用户ID相关的键来存储这些信息


    你的肮脏解决方案并不是最糟糕的,因为你一开始就知道你有多少个测验,然后可以分配阵列。

    选项2肯定是正确的:

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

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


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

    感谢您的快速回答!你建议我怎么做?我现在有了一个UserData集合,它以数组为特征。如何将其转换为具有用户id的测验对象?我我猜你在UserData中有一个测验对象,它包含每个测验id和相关的currentquestion。我有点迷茫,因为如果不看代码,就很难描述如何在我的mongodbIt中创建这样一个额外的层。但是,与在
    UserData
    文档中包含对象不同,我将拥有一个完全独立的
    QuizData
    集合,其中包含
    userId
    quizId
    score
    (或者目前存储在数组中的任何内容)的文档。然后,对于登录用户,您只需在服务器端通过
    userId
    过滤(即
    find
    )文档,并通过
    Meteor.publish
    返回这些文档,这样登录用户即使在同一个集合中也只能看到自己的分数。