JavaScript splice()迭代时未定义索引
我正在尝试根据条件从数组中删除项JavaScript splice()迭代时未定义索引,javascript,arrays,lodash,Javascript,Arrays,Lodash,我正在尝试根据条件从数组中删除项 var Stack = {}; Stack.items = []; Stack.items.push({ id: '123', name: 'Lorem ipsum dolor sit.' }); Stack.items.push({ id: '154', name: 'Lorem ipsum dolor sit.' }); Stack.items.push({ id: '123', name: 'Lor
var Stack = {};
Stack.items = [];
Stack.items.push({
id: '123',
name: 'Lorem ipsum dolor sit.'
});
Stack.items.push({
id: '154',
name: 'Lorem ipsum dolor sit.'
});
Stack.items.push({
id: '123',
name: 'Lorem ipsum dolor sit.'
});
现在,我将删除id为154的所有项目
$.each(Stack.items, function(index, item) {
// console.log( item.id );
// console.log( index);
if( item.id === '154' ) {
Stack.items.splice(index, 1);
}
});
但是我在第二次迭代中得到了一个未定义的错误。我认为这是因为splice()函数修改了原始数组,所以索引被修改了
Uncaught TypeError: Cannot read property 'id' of undefined
我用lodash得到了预期的结果,但我试图不只是在这个问题上使用它们
_.remove(Stack.items, function(item) {
return item.id === '123';
});
谢谢 如果必须进行就地修改,则需要使用另一种方法。只有在未删除元素的情况下,才能增加索引。例如:
var index = 0;
while ( index < Stack.items.length ) {
var item = Stack.items[index];
if ( item.id === '154' )
Stack.items.splice(index, 1);
else
index++;
}
如果必须进行就地修改,则需要使用另一种方法。只有在未删除元素的情况下,才能增加索引。例如:
var index = 0;
while ( index < Stack.items.length ) {
var item = Stack.items[index];
if ( item.id === '154' )
Stack.items.splice(index, 1);
else
index++;
}
由于这个原因,在迭代集合时更改集合通常不是一个好主意。您可以通过一次查找要删除的索引,然后迭代该集合以删除项。或者,您可以从数组的末尾开始,朝第一个元素前进,这样您尚未处理的项目就不会移动。或者,您可以将没有
id==“123”
的项复制到新集合(例如使用filter
)。您可以通过一次查找要删除的索引,然后迭代该集合以删除项。或者,您可以从数组的末尾开始,朝第一个元素前进,这样您尚未处理的项目就不会移动。或者,您可以将没有id==“123”
的项目复制到新集合中(例如,使用filter
)。如果需要支持IE 8,则提供类似的功能。如果需要支持IE 8,则提供类似的功能。