迭代数组时出现javascript错误

时间:2014-04-24 11:09:15

标签: javascript jquery

function sortproducts(filprodlist)
{
    var prod;
    var k = 0;
    for (i = 0; i < filprodlist.length; i++) {
        var k = i + 1;
        var p=filprodlist[i].EntityKey.substr(filprodlist[i].EntityKey.length - 1);
        var p2=filprodlist[k].EntityKey.substr(filprodlist[k].EntityKey.length - 1);
        if ( p>p2)  {
            temp = filprodlist[k];
            filprodlist[k] = filprodlist[i];
            filprodlist[i] = temp;
        }
    }
    rederProduct(filprodlist);
}

执行上面的代码时出现以下错误 TypeError:filprodlist [k]未定义

3 个答案:

答案 0 :(得分:1)

原因

在最后一次迭代中,i是数组的最后一个元素。您正在使用var k = i + 1;,其中k不存在。因此,你得到了错误。

所以使用

for (i = 0; i < filprodlist.length - 1; i++) {

而不是

for (i = 0; i < filprodlist.length; i++) {

答案 1 :(得分:0)

我们说filprodlist有10个项目。然后将项目编入索引0-9,并使i经过0-9。在每次迭代中,您都要定义k = i + 1。因此,在上一次迭代i = 9k = 10中,您正在尝试访问不存在的filprodlist[10](返回undefined)。解决方案是@ Satpal的答案。

答案 2 :(得分:0)

不要var内部循环,块在 JavaScript 中没有范围,var要在一个var语句中使用的每个变量。当最高索引到达结尾时结束循环(k)。您可以将k移到for的迭代步骤中,因为您也正在迭代这一步。

function sortproducts(filprodlist) {
    var prod, i, k, p, p2, temp;
    for (i = 0, k = 1; k < filprodlist.length; ++i, ++k) {
        p =  filprodlist[i].EntityKey.substr(filprodlist[i].EntityKey.length - 1);
        p2 = filprodlist[k].EntityKey.substr(filprodlist[k].EntityKey.length - 1);
        if (p > p2)  {
            temp = filprodlist[k];
            filprodlist[k] = filprodlist[i];
            filprodlist[i] = temp;
        }
    }
    rederProduct(filprodlist);
}

另一种方法是忘记k,从i = 1开始并使用i - 1i,这意味着您使用较少的变量进行迭代,您可能更容易在脑海中遵循代码。