错误:columnListA [i]未定义

时间:2014-04-01 15:44:27

标签: javascript json splice

当我尝试使用columnListB中存在的对象从columnListA中删除某个对象时,我得到Error: columnListA[i] is undefined

任何人都可以告诉我一些解决方案。

我的json列表如下所示:

columnListA =[ {id:"a1", value:"XYZ"},{id:"a2", value:"ABC"},{id:"a3", value:"JHI"},{id:"a4", value:"PLM"}]

columnListB =[ {id:"a1", value:"XYZ"}]

我的代码就是这个

for ( var j = 0, selLength = columnListB.length; j < selLength; j++)
{
    for ( var i = 0, nonSelLength = columnListA.length; i < nonSelLength; i++)
    {
     if (columnListA[i].id=== columnListB[j].id)
     {
       columnListA.splice(i, 1);
     }
    }
}

2 个答案:

答案 0 :(得分:2)

你得到这个是因为你正在改变columnListA。由于您删除了一个元素,因此它的长度从4传递到3,但您仍然会迭代直到i = 3。

我建议创建一个新数组,而不是在原地进行更改并冒这种类型的错误。例如:

columnListA = columnListA.filter(function(nonSel) {
  return columnListB.some(function(sel) {
    return sel.id !== nonSel.id;
  });
});

Array#filter接受一个函数,并返回一个新数组,该数组只包含函数返回true的元素。

Array#some接受一个函数,如果函数对数组中的所有元素都返回true,则返回true,否则返回false

答案 1 :(得分:1)

尝试:

for ( var j = 0; j < columnListB.length; j++)
{
    for ( var i = 0; i < columnListA.length; i++)
    {
        if (columnListA[i].id === columnListB[j].id)
        {
            columnListA.splice(i, 1);
        }
    }
}

JSFiddle

从循环中删除nonSelLength = columnListA.length; i < nonSelLength;,只需将变量定义为小于对象的长度