从数组

时间:2017-09-11 07:02:15

标签: javascript

我有一个对象数组

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条记录。请告诉我我做错了什么。

4 个答案:

答案 0 :(得分:3)

var CountryLen = this.Country.length; 

此条件会向您返回3。但是当您从数组中删除任何元素时,您的索引会重新排列。因此,对于第一次迭代,您将获得一个包含两个元素索引01的数组。在最后一次迭代之前,您获得i2,但您的数组包含一个索引为0的元素。因此,当您运行record.data.id == this.CountryRec[i].id时,它将转到未定义的索引2

如果您的ID是唯一的,请使用break

答案 1 :(得分: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;
    }
}

答案 2 :(得分: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;
    }
}

答案 3 :(得分:1)

我想补充@SurenSrapyan的答案。

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

例如,如果您正在做这样的事情:

var checkRec = myRec;

相反,这样做:

var checkRec = some_clone_function(myRec);