为什么这段JavaScript代码会出现无限循环?

3

optionElements是一个二维数组。每个元素都有一个长度为2的数组,其中包含一个整数和一个元素。我有一个选择列表称为linkbox,并且我想将所有元素添加到选择列表中。我希望它们按照它们各自的整数值从小到大排序。所以可以这样理解:

optionElements如下:

[ [5, <option>], [3, <option], [4, <option], [1, <option], [2, <option]]

它会按照这些数字的顺序将它们添加到链接框中。但事实并非如此。第一次后会进入无限循环。我添加了x约束只是为了防止它冻结我的浏览器,但您可以忽略它。

var b;
var smallest;
var samllestIndex;
var x = 0;
while(optionElements.length > 0 && ++x < 100)
{
    smallestIndex = 0;
    smallest = optionElements[0][0];
    b = 0;
    while( ++b < optionElements.length)
    {
        if(optionElements[b][0] > smallest)
        {
            smallestIndex = b;
            smallest = optionElements[b][0];
        }                    
    }                    
    linkbox.appendChild(optionElements[smallestIndex][1]);
    optionElements.unshift(optionElements[smallestIndex]);
}

有人能指出我的问题在哪里吗?

更新

忘记在while循环中添加>符号是错误的,但不是问题的原因。

3个回答

4
这是一个无限循环,因为unshift将传入的数组添加到调用它的数组中。因此,外部循环检查optionElements是否有多于0个项目,然后在结尾处它变得更大,所以该循环永远不会退出。 http://www.w3schools.com/jsref/jsref_unshift.asp 我也不确定你为什么要这样做。为什么不先对optionElements数组进行排序,然后再遍历一次将每个元素添加到linkbox中呢?

2

来自javascript unshift()函数

unshift()方法将新元素添加到数组的开头,并返回新长度。

这意味着您不断地向开头添加元素而不是删除它们,从而导致无限循环。

尝试使用计数器运行循环optionElements.length次(性能更好)。或者,您可以使用shift()来获得所需的效果:

optionElements.shift();

:D


1

我可以告诉你,在IE中.unshift()不起作用。所以如果你之前使用的是IE,你可能要在Mozilla/Safari中测试。


现在我想起来了,你是指从optionElements数组中删除项目吗?unshift()会添加一个元素。你应该使用类似于shift()或pop()的东西。 - weiy
这也是我的想法,我认为他正在向数组中添加内容,并且有一个条件使得循环只有在数组为空时才会退出。也许他认为unshift会像pop一样从末尾弹出? - CodexArcanum
也许他正在寻找 splice() 函数?http://www.w3schools.com/jsref/jsref_splice.asp - Hasturkun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接