我有一个对象数组
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条记录。请告诉我我做错了什么。
答案 0 :(得分:3)
var CountryLen = this.Country.length;
此条件会向您返回3。但是当您从数组中删除任何元素时,您的索引会重新排列。因此,对于第一次迭代,您将获得一个包含两个元素索引0
和1
的数组。在最后一次迭代之前,您获得i
值2
,但您的数组包含一个索引为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);