从对象数组中检索对象的元素

时间:2012-12-18 08:20:40

标签: javascript

我有数组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值 仅检索数组中的最后一个值。

3 个答案:

答案 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
});

每次推动时都会创建一个新对象,而不会引用干扰 (它的代码较少;-))