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,则提供类似的功能。