2012-03-20 48 views
0

我是一个新手程序员,并为复杂的问题提前道歉。在For-Loop中创建一个计数器?

我试图为实验研究创建一个词汇决策任务,在这个任务中,受访者必须决定屏幕上显示的一系列字母是否产生“单词”或“不是一个单词”。除了我想从一个单独的输入文件(input.txt)为80个试验中的每一个随机选择一个字(类别A)或非字(类别B)的位之外,一切工作都很合理。随机化工作,但每个列表(类别A或B)中的一些元素会被跳过,因为我使用了“round.catIndex = j;”其中“j”是每个连续试验的循环。由于一些试验从A类和B类中随机选择,因此“j”不会在每个类别的列表中依次移动。相反,类别A列表中的元素可以从1,2,5,8,9,10等等中选择(每次因随机化而变化)。为了长话短说(!),我该如何创建一个计数器,以便在每个试验的for循环中工作,以便分别使用A类和B类的每个单词和非单词将用于词汇决策任务?到目前为止我尝试过的所有东西都无法正常工作,或完全打破了JavaScript。

下面是我的代码片段,完整的代码在http://50.17.194.59/LDT/trunk/LDT.js。此外,完整的词汇决策任务可以在http://50.17.194.59/LDT/trunk/LDT.php访问。谢谢!

function initRounds() 
    { 
     numlst = []; 
     for (var k = 0; k<numrounds; k++) 
      { 
       if (k % 2 == 0) numlst[k] = 0; 
       else numlst[k] = 1; 
      } 
     numlst.sort(function() {return 0.5 - Math.random()}) 

     for (var j = 0; j<numrounds; j++) 
      {  
       var round = new LDTround(); 
       if (numlst[j] == 0) 
        { 
         round.category = input.catA.datalabel; 
        } 
       else if (numlst[j] == 1) 
        { 
         round.category = input.catB.datalabel; 
        } 

       // pick a category & stimulus 
        if (round.category == input.catA.datalabel) 
         { 
          round.itemtype = input.catA.itemtype; 
          round.correct = 1; 
          round.catIndex = j; 
         } 
        else if (round.category == input.catB.datalabel) 
         { 
          round.itemtype = input.catB.itemtype; 
          round.correct = 2; 
          round.catIndex = j; 
         }  
        roundArray[i].push(round); 
       } 
     return roundArray; 
    } 

回答

0

可以使用comma operator到一个for循环内声明多个变量和执行多个语句。

在你的情况,你可以这样做:

for(var CatAIndex = 0, CatBIndex = 0; CatAIndex+CatBIndex < numrounds; incrementA ? CatAIndex++ : CatBIndex++) { 
    // Insert your code here 
} 

我选择那些冗长的变量名称,使之更加清晰。对于类别A和B,您将有两个单独的索引,并将两者的总和与您想要运行的回合数进行比较。然后在您的for循环内某处,将布尔incrementA设置为truefalse以指示要增加哪一个。

这大致与你问什么,但我认为你宁愿是使用Math.random<array>.splice<array>.length的组合来得到一个随机字/非单词从每个列表,而不是产生一个可预测的顺序供选择。那么你甚至不会保护这两个类别的指数是什么,你可以回到简单的for(var i = 0; i < numrounds; i++)类型的循环。

如果后者是你真正想要的,请对这个答案留言,我会用另一个例子进行更新。

编辑:

好吧,我假设词与非词的实际数量和顺序不被测试真正定义,否则用户可以拿起字/非字样和圣诞树的测试。我还假设您在全球范围内有两个词组和非单词catAcatB。以下功能将执行以下操作:

  1. 随机选取一个单词或非单词。
  2. 不要重复一个单词或非单词选择(意思是说,从技术上讲,它变得更确定,越接近列表的末尾)
  3. 直到所有单词都用尽,在这一点上它会自动“刷新”它的从catAcatB数组列表。(所以你可以,如果你喜欢设置numrounds+inf

var pickAWord = (function outerScope() { 
    var allWords = []; 
    return function innerClosure() { 
     if(allWords.length == 0) { 
      allWords = [].concat(catA, catB); 
     } 
     return allWords.splice(Math.floor(Math.random()*allWords.length), 1)[0]; 
    }; 
})(); 

该功能使用功能p编程闭包的概念来创建一个持久的“类似全球”的变量,allWords,只有它可以看到。当数组的长度达到零(例如从头开始)时,函数使用全局值catAcatB自动刷新阵列。要在使用它,只需简单:如果您需要确保所使用的catAcatB字的数目相等

for(var i = 0; i < numrounds; i++) { 
    var wordToUse = pickAWord(); 
    // Do something 
} 

,该outerScope功能将需要保持三个变量的轨迹:中catA副本, catB,以及与numrounds相同尺寸的阵列,其中一半是true和一半falsesplice,然后根据它是true还是false随机地从catAcatB进行拼接。然后,你的函数将需要代码来“刷新”所有这些闭包变量,但它与本函数如何写在上面基本相同。

对不起,如果功能有点复杂,但你看它是多么容易使用,对吧? :)

+0

非常感谢您的详细评论。正如你猜测的那样,你的后一个建议更符合我想做的事情(我只是不知道该怎么做)。如果你可以发布一个例子,我应该(希望)能够弄清楚如何将它添加到我的程序中。再次感谢! – 2012-03-21 02:25:05

+0

嘿,我昨天晚上回答你的时候睡觉了。我已经编辑了如何解决这个问题。 – 2012-03-21 16:12:38

+0

啊,真的很酷。你的解释有助于我理解如何解决这个问题(最后!)。我会让你知道它是怎么回事...... – 2012-03-22 04:06:46

0

我不完全确定我理解你的问题。这里是我对你的问题的解释:

你想使用for循环来处理所有的A类元素(以及类似的另一个循环来处理所有的B类元素)。在这种情况下,您可以通过roundArray循环并根据其类别处理元素:

for (var j=0; j < numrounds, j++) { 
    var round = roundArray[i][j]; 
    // you might want to use a test better suiting the context if input is not available at the 
    // time when round is processed, I am using this based on the code sample you provided 
    if (round.itemType == input.catA.itemType) { 
    // process round as Category A 
    // use numlst[round.catIndex] to access the corresponding element in numlst 
    } else { 
    // process round as Category B 
    // use numlst[round.catIndex] to access the corresponding element in numlst 
    } 
} 
// alternatively, you can break the loop into two and process only Category A in one instance 
// and only Category B in the other (the if branch corresponding to the other category would be 
// empty) 

如果这不是您的意图,请澄清。

+0

感谢您的建议。自从他首先回答后,我最终使用了David Ellis的帮助。干杯! – 2012-03-27 00:32:22