拼接第一个对象返回 TypeError: 无法读取未定义的属性
2020-06-19
6668
我有一个这样的数组:
var arrSession = [ { name: 'Product 01', groupID: '50303', delivery: 'mail'}, { name: 'Product 02', groupID: '50403', delivery: 'bike'} ]
这个循环用于删除特定对象:
for(var i=0, len=arrSession.length; i<len; i++) {
if (arrSession[i].groupID == getGroupID && arrSession[i].delivery == getDelivery) {
arrSession.splice(i, 1);
}
}
如果我删除最后一个对象,则一切正常:
var getGroupID = 50403;
var getDelivery = bike;
但是,如果我删除第一个对象:
var getGroupID = 50303;
var getDelivery = mail;
我收到错误:
TypeError: Cannot read property 'groupID' of undefined
为什么这样以及如何解决?
编辑:
如果只有一个对象,则一切正常。
var arrSession = [ { name: 'Product 01', groupID: '50303', delivery: 'mail'} ]
3个回答
简短回答
:由于
for
循环语法。
初始化
仅发生
一次
。您错过了在
拼接
之后更新
len
。
for ([initialExpression]; [condition]; [incrementExpression]) statement
解决方案
:正如其他答案中提到的,您可以
中断
循环(如果您只拼接一个项目,这将起作用)。
const arrSessionActual = [{
name: 'Product 01',
groupID: '50303',
delivery: 'mail'
}, {
name: 'Product 02',
groupID: '50403',
delivery: 'bike'
}];
function removeItem(arrSession, getGroupID, getDelivery) {
for (var i = 0,
len = arrSession.length; i < len; i++) {
if (arrSession[i].groupID == getGroupID && arrSession[i].delivery == getDelivery) {
arrSession.splice(i, 1);
len = arrSession.length; // This is missing
}
}
console.log(arrSession);
}
removeItem(arrSessionActual.slice(), 50403, 'bike');
removeItem(arrSessionActual.slice(), 50303, 'mail');
Sree.Bh
2020-06-19
我认为这是因为当循环开始时,它会上升到索引 1。删除索引 0 后,循环仍会尝试运行并搜索索引 1,即已被移动的第二个对象。如果在 if 语句中放置
break
关键字,错误应该会得到修复。
for(var i=0, len=arrSession.length; i<len; i++) {
if (arrSession[i].groupID == getGroupID && arrSession[i].delivery == getDelivery) {
arrSession.splice(i, 1);
break;
}
}
Simon Tamás
2020-06-19
非常简单,您从数组的开头进行迭代,并在找到后拼接数组。现在数组比存储的长度短,任何访问都会出错。
您可以改为从末尾循环。
var arrSession = [{ name: 'Product 01', groupID: '50303', delivery: 'mail' }, { name: 'Product 02', groupID: '50403', delivery: 'bike' }],
getGroupID = 50303,
getDelivery = 'mail',
i = arrSession.length;
while (i--) {
if (arrSession[i].groupID == getGroupID && arrSession[i].delivery == getDelivery) {
arrSession.splice(i, 1);
}
}
console.log(arrSession);
Nina Scholz
2020-06-19