2012-12-18 43 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 
}); 

這將每次按壓時間創建一個新的對象,沒有引用干擾。
(和它的更少的代碼;-))