开发者问题收集

拼接第一个对象返回 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