Javascript无限循环直到某个条件

时间:2015-01-24 19:32:08

标签: javascript arrays loops infinite-loop

// Contains a list of items in each set.
var sets[0] = [1,2,3,4,5,6,7,8,9],
    sets[1] = [10,11,12,13,14,15,16,17,18],
    sets[2] = [19,20,21,22,23,25,26,27]

// Contains the mins associated to each set item.
var setTimes[0] = [15,15,15,15,15,15,15,15,15],
    setTimes[1] = [16,12,11,15,13,15,15,15,14],
    setTimes[2] = [16,12,11,15,13,12,11,15,13]

我有一组上面给出的数组。 sets数组具有值的数据集。该数组中可以包含n个项目。例如,sets[n]。 每个sets数组都有一个等效的setTimes数组,其中存储了分钟数。 setTimes[0][0]为15分钟,是sets[0][0]的分钟数。

给定一个设定项目(例如12),我想:

  1. 找出给定数字属于哪个集合数组?在我们的例子中,由于12是项目,因此它属于sets[1]
  2. 一旦有了这个,我想得到当前集合索引的setTimes数组中所有分钟的总和以及下一个索引。在我们的例子中,这将是setTimes[1]setTimes[2]
  3. 的总和
  4. 如果我们到达sets数组的末尾,我想得到第一个数组的总和。 对于前者,      - 如果我通过12,我需要得到setTimes[1]setTimes[2]的总和      - 如果我通过23,我需要得到setTimes[2]setTimes[0]
  5. 的总和

    以下是我一直在思考的循环,想知道是否有更好的方法。

    function computeTotalMin(givenItem)
    {
        // represents how many sets to loop thorough. I need 2.
        for (x = 0; x <= 1; x++)
        {
            for(i = 0; i < sets.length; i++)
            {
                // checking to see if i value is on the last index of the sets array.
                if(i === sets.length - 1)
                {
                    i = 0;
                    var item = sets[i].indexOf(givenItem);
    
                    if(item !== -1)
                    {
                        // Loops through all mins from setTimes[i] array
                        for(j = 0; j < setTimes[i].length; j++)
                        {
                            var total = total + setTimes[j];
                        }
                    }
                }
    
            }   
        }
    }
    

1 个答案:

答案 0 :(得分:0)

你不需要两个嵌套循环来继续结束。你应该有一个循环来迭代你感兴趣的集合数量(2),并且有一个索引(从你找到的那个集合开始)。在该循环中,您将对索引进行模运算;当你到达终点时回到起点。通过仅循环计数而不是(可重置的)索引,您将无法进入无限循环。

您还应该将您的程序划分为您已经文本描述的任务(找到它,然后执行此操作),而不是在一个巨大的嵌套控件结构中咀嚼所有内容。

function computeTotalMin(givenItem) {
    var setIndex = -1;
    for (; setIndex < sets.length; setIndex++)
        if (sets[setIndex].indexOf(givenItem) > -1)
            break;
    if (setIndex == sets.length)
        return null; // givenItem found in none of the sets

    var sum = 0;
    for (var count = 0; count < 2; count++) {
        for (var i=0; i<setTimes[setIndex].length; i++)
            sum += setTimes[setIndex][i];

        setIndex++; // go to next set
        setIndex %= sets.length; // which might be 0
        // alternatively: if (setIndex == sets.length) setIndex = 0;
    }
    return sum;
}