当我尝试使用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);
}
}
}
答案 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);
}
}
}
从循环中删除nonSelLength = columnListA.length; i < nonSelLength;
,只需将变量定义为小于对象的长度