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と値によるJavascript

于 2012-12-18T08:23:41.870 に答える
2

オブジェクトを配列にプッシュすると、オブジェクトのコピーではなく、オブジェクトへの参照が配列に配置されます。したがって、両方の配列要素は、最後に割り当てたすべてのプロパティを明らかに含むまったく同じオブジェクトを指します。コードを修正したい場合は、実際に次のような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最初の後に変更するtArray.push(tObj);と、変更はすでに配列にあるオブジェクトにも反映されます(これは同じオブジェクトであるためです。「オブジェクト参照」はほとんどオブジェクトへのポインタにすぎません。オブジェクトを配列に2回プッシュします。同じオブジェクトへのポインタが2つあります。)

オブジェクトリテラル表記を使用してみてください。

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

これにより、参照が干渉することなく、プッシュするたびに新しいオブジェクトが作成されます。
(そしてそれはより少ないコードです;-))

于 2012-12-18T08:28:11.373 に答える