从数组中删除一个元素时,id未定义

4

我是一个有用的助手,可以帮您进行文本翻译。

我有一个对象数组:

var Country = [];

它类似于:

{
    "Name" : "IND"
    "Capital" : "Delhi"
    id : someID1
},
{
    "Name" : "USA"
    "Capital" : "WS"
    id : someID2
},
{
    "Name" : "UK"
    "Capital" : "London"
    id : someID3
}

现在我想根据特定条件删除一个元素,但是当记录超过2条时会出现错误。

我的错误信息是: 无法读取未定义的属性'id'

我的代码如下:

remove : function(me, record, index){
    var CountryRec = this.Country;
    var CountryLen = this.Country.length;
    for(var i=0; i<CountryLen; i++){
        if(record.data.id == this.CountryRec[i].id){
            //delete this.checkRec[i];
            checkRec.splice(i,1);
        }
    }
}

当超过2条记录时会抛出错误,请告诉我哪里有问题。


1
以相反的顺序迭代,然后使用splice或在删除时递减i - Satpal
4个回答

3
var CountryLen = this.Country.length; 

这个条件会返回3。但是当你从数组中删除任何元素时,你的索引会重新排列。因此,在第一次迭代中,你得到一个包含两个元素的数组,它们的索引为01。并且在最后一次迭代之前,你得到i值为2,但是你的数组只包含一个索引为0的元素。所以当你运行record.data.id == this.CountryRec[i].id时,它会去到索引2,而这是未定义的。

如果你的id是唯一的,请使用break


是的,我明白了。但是我应该在这里使用break吗? - David

2

假设你有唯一的ID,那么在使用break删除后,可以离开循环。

var CountryRec = this.Country;
var CountryLen = this.Country.length;
for (var i = 0; i < CountryLen; i++) {
    if(record.data.id == CountryRec[i].id) {
        CountryRec.splice(i, 1);
        break;
    }
}

我也是这么想,但不确定。感谢你的回答。 - David

1

我想补充@SurenSrapyan的答案。

函数“splice”会改变数组。所以,如果checkRec是对数组的引用,并且还有另一个引用指向同一个数组,这可能会导致问题。那是因为JS处理对象引用的方式。在创建checkRec时,您需要进行适当的克隆。有许多不同的方法来克隆数组或对象。请阅读this

例如,如果您正在执行以下操作:

var checkRec = myRec;

相反,这样做:

代替

var checkRec = some_clone_function(myRec);

这是一种方式,也让我印象深刻,促使我改变了我的代码。感谢这个想法。 - David

1

var Country = [
{
    "Name" : "IND",
    "Capital" : "Delhi",
    'id' : 'someID1'
},
{
    "Name" : "USA",
    "Capital" : "WS",
    'id' : 'someID2'
},
{
    "Name" : "UK",
    "Capital" : "London",
    'id' : 'someID3'
}];

var CountryRec = this.Country;
var CountryLen = this.Country.length;
for(var i=0; i<CountryLen; i++){
    if('someID2' == this.CountryRec[i].id){
        console.log(this.CountryRec.splice(i,1));
        break;
    }
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接