我有数组NatArray和对象NatObj,我正在推动这个对象 前一个数组,但在检索它只获取最后一个条目时, 这是我的代码
var tArray = [];
var tObj ;
tObj = {};
tObj.TranslatedLocIpAddr = 202116107;
tObj.TranslatedLocPort = 123;
tObj.LocIp = 50529027;
tObj.LocPort = 324;
tObj.LocPortRange = 5;
count = 0;
tArray.push(tObj) ;
tObj.TranslatedLocIpAddr = 202116108;
tObj.TranslatedLocPort = 130;
tObj.LocIp = 67372036;
tObj.LocPort = 324;
tObj.LocPortRange = 5;
count = 1;
tArray.push(tObj) ;
for (var i = 0; i <= count ;i++) {
if( (tArray[i].TranslatedLocIpAddr == tGlobalIp)
&& (tArray[i].TranslatedLocPort == tGlobalPort) ) {
alert("Existing t entry");
return false;
}
}
我每次都验证了tArray[i].TranslatedLocIpAddr
值
仅检索数组中的最后一个值。
答案 0 :(得分:6)
您正在更改同一个对象。您将tObj
推送到数组,但对象仍然存在,并且该数组包含对该对象的引用。因此,任何更改都将反映在引用对象的任何位置。
有关详细信息,请参阅此SO答案:Javascript by reference vs. by value
答案 1 :(得分:2)
将对象推入数组只是将对象的引用放入数组中,而不是对象的副本。因此,两个数组元素都指向完全相同的对象,这显然包含您上次分配给它的所有属性。如果要修复代码,则需要实际创建第二个对象:
var tArray = [];
var tObj ;
tObj = {};
tObj.TranslatedLocIpAddr = 202116107;
tObj.TranslatedLocPort = 123;
tObj.LocIp = 50529027;
tObj.LocPort = 324;
tObj.LocPortRange = 5;
count = 0;
tArray.push(tObj) ;
// create second object that is different from the first object
tObj = {};
tObj.TranslatedLocIpAddr = 202116108;
tObj.TranslatedLocPort = 130;
tObj.LocIp = 67372036;
tObj.LocPort = 324;
tObj.LocPortRange = 5;
count = 1;
tArray.push(tObj) ;
for (var i = 0; i <= count ;i++) {
if( (tArray[i].TranslatedLocIpAddr == tGlobalIp)
&& (tArray[i].TranslatedLocPort == tGlobalPort) ) {
alert("Existing t entry");
return false;
}
}
答案 2 :(得分:1)
您正在向阵列推送“对象引用”。在第一个tObj
之后更改tArray.push(tObj);
时,您的更改也会反映在数组中已有的对象中(因为它是同一个对象。“对象引用”几乎只是一个指向将对象推送到数组两次,并且有2个指向同一对象的指针。)
尝试使用对象文字符号:
tArray.push({
"TranslatedLocIpAddr": 202116107,
"TranslatedLocPort": 123,
"LocIp": 50529027,
"LocPort": 324,
"LocPortRange": 5
});
每次推动时都会创建一个新对象,而不会引用干扰 (它的代码较少;-))