2

我有数组 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值,每次它只检索数组中的最后一个值。

4

3 回答 3

6

您正在更改同一个对象。您推tObj送到数组,但对象仍然存在,并且数组包含对该对象的引用。因此,任何更改都将反映在引用对象的任何位置。

有关更多详细信息,请参阅此 SO 答案:Javascript by reference vs. by value

于 2012-12-18T08:23:41.870 回答
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;
    } 
}
于 2012-12-18T08:27:23.633 回答
1

您正在将“对象引用”推送到数组。当您tObj在 first 之后更改时tArray.push(tObj);,您的更改也会反映在数组中已经存在的对象中(因为那是同一个对象。“对象引用”几乎只是指向对象的指针。将对象推送到数组两次,并且您有 2 个指向同一个对象的指针。)

尝试使用对象文字表示法:

tArray.push({
    "TranslatedLocIpAddr": 202116107,
    "TranslatedLocPort": 123,
    "LocIp": 50529027,
    "LocPort": 324,
    "LocPortRange": 5
});

这将在您每次推送时创建一个新对象,而不会干扰引用。
(而且代码更少;-))

于 2012-12-18T08:28:11.373 回答