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]);
}
有人能指出我的问题在哪里吗?
更新
忘了添加&gt; while循环中的符号是错误的,但不是问题的原因。
答案 0 :(得分:4)
这是一个无限循环,因为unshift会将您传入的数组添加到您正在调用它的数组中。因此外部循环检查optionElements是否有多于0的项,然后在最后它变大,以便循环永远不会退出。 http://www.w3schools.com/jsref/jsref_unshift.asp
在任何情况下,我也不确定你为什么这样做。为什么不首先对optionElements数组进行排序,然后迭代一次以将每个元素添加到链接盒中?
答案 1 :(得分:2)
来自javascript unshift() function:
unshift()方法将新元素添加到数组的开头,并返回新的长度。
这意味着你不断添加元素而不是删除它们,给你无限循环。
尝试使用计数器运行循环optionElements.length
次性能更好。或者您可以使用shift()来获得所需的效果:
optionElements.shift();
:d
答案 2 :(得分:1)
我可以告诉你.unshift()在IE中不起作用。因此,如果您以前使用IE,可能需要在Mozilla / Safari中进行测试。