JavaScript splice()迭代时的未定义索引

时间:2015-12-03 19:45:11

标签: 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: 'Lorem ipsum dolor sit.'
});

现在,我将删除所有154 id的项目。

$.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';
});

谢谢!

1 个答案:

答案 0 :(得分:4)

如果必须需要进行修改,您将需要使用其他方法。如果未删除元素,则只能递增索引。一个例子是:

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 newItems = Stack.items.filter(function(item) {
    return item.id !== '154';
});