2012-12-18 42 views
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值,每次它 仅检索数组中的最后一个值。

回答

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; 
    } 
} 
+0

难道你需要'tObj1'或类似的东西? –

+0

非常感谢,现在它工作 – kelvin

+1

@JanHančič - 不,你并不需要第二个变量。第一个'.push后右()',无论是阵列元件和'tObj'可变点相同的对象。然后,当分配'tObj = {};'第二时间,即一个新的空对象分配给'tObj',但该阵列的第一个元素仍包含所述第一对象的引用。第二个'.push()'然后将第二个对象放入数组中。 – jfriend00

6

你正在改变同一个对象。你推tObj到阵列,但对象仍然存在,而数组保存到该对象的引用。所以任何改变都会反映在对象被引用的任何地方。

请参阅本SO回答更多的细节:Javascript by reference vs. by value

1

你是推一个“对象引用”到数组。当你在第一个tArray.push(tObj);之后改变tObj时,你的改变也反映在数组中已经存在的对象中(因为它是同一个对象,“对象引用”几乎只是一个指向对象的指针。两次,你有2个指向同一个对象)

尝试使用对象的文字符号:

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

这将每次按压时间创建一个新的对象,没有引用干扰。
(和它的更少的代码;-))