Javascript 无限循环直到某个条件
Javascript loop infinitely up till a certain condition
// 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),我想:
- 找出给定的数字属于哪个集合数组?在我们的例子中,因为 12 是项目,所以它属于
sets[1]
.
- 一旦有了这个,我想从
setTimes
数组中获取当前集索引和下一个索引的所有分钟的总和。在我们的例子中,这将是 setTimes[1]
和 setTimes[2]
. 的总和
- 如果我们到达集合数组的末尾,我想获得第一个集合数组的总和。
例如,
- 如果我超过 12,我需要得到
setTimes[1]
和 setTimes[2]
的总和
- 如果我超过 23,我需要得到 setTimes[2]
和 setTimes[0]
的总和
这是我一直在想的循环,想知道是否有更好的方法。
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];
}
}
}
}
}
}
您不需要两个嵌套循环就可以在最后继续。您应该有一个循环来迭代您感兴趣的集合数 (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;
}
// 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),我想:
- 找出给定的数字属于哪个集合数组?在我们的例子中,因为 12 是项目,所以它属于
sets[1]
. - 一旦有了这个,我想从
setTimes
数组中获取当前集索引和下一个索引的所有分钟的总和。在我们的例子中,这将是setTimes[1]
和setTimes[2]
. 的总和
- 如果我们到达集合数组的末尾,我想获得第一个集合数组的总和。
例如,
- 如果我超过 12,我需要得到
setTimes[1]
和setTimes[2]
的总和 - 如果我超过 23,我需要得到setTimes[2]
和setTimes[0]
的总和
这是我一直在想的循环,想知道是否有更好的方法。
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];
}
}
}
}
}
}
您不需要两个嵌套循环就可以在最后继续。您应该有一个循环来迭代您感兴趣的集合数 (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;
}