32

「John.Doe.100.Newbie-David.Miller.250.Veteran-」のような文字列を SplitDatabase 関数に渡します。この関数は、文字列を適切に分割し、値を UserDataEntry オブジェクトに割り当てます。次に、UserDataEntry オブジェクトは、すべてのユーザー データを格納することになっているグローバル UserData 配列にプッシュされます。

ただし、何らかの理由で、 UserData.push(UserDataEntry) 部分が UserData 配列内の以前のデータを上書きしているようです。1 番目のループのアラートはループ時に正しいデータを表示しますが、一番下の 2 番目のループのアラートは最後のレコードを何度も表示します。

よくわかりませんが、これはなぜですか?

var UserData = [];


function SplitDatabase(result) {
    var RawUsers = result.split('-');
    var UserDataEntry = {};


    for (var i = 0; i < (RawUsers.length - 1); i++) {
        var tempUserData = RawUsers[i].split('.');
        for (var x = 0; x < (tempUserData.length); x++) {

            switch (x) {
            case 0:
                UserDataEntry.firstname = tempUserData[x];
                break;
            case 1:
                UserDataEntry.lastname = tempUserData[x];
                break;
            case 2:
                UserDataEntry.points = tempUserData[x];
                break;
            case 3:
                UserDataEntry.rank = tempUserData[x];
                UserData.push(UserDataEntry);
                alert(UserData[i].firstname);
                break;
            }
        }

    }

    for (var i = 0; i < (UserData.length); i++) {  
        alert(UserData[i].firstname);
    }

}
4

2 に答える 2

77

pushJavaScript は参照によって渡されるため、呼び出してもオブジェクトはコピーされません。すべての配列エントリObjectと同じものをプッシュしています。Object

var UserDataEntry = {}; これは、ループ本体の内側を移動することで簡単に修正できます。これにより、ループの反復ごとに新しいオブジェクトが作成されます。

    for (var x = 0; x < (tempUserData.length); x++) {
         var UserDataEntry = {};
于 2013-09-27T15:53:56.297 に答える
10

var UserDataEntry = {}を for ループの中に入れます。

現在、オブジェクトは 1 つしかなく、配列の各部分をそのオブジェクトに設定しています。ループ内のメンバーを上書きします。

ループ内で新しいオブジェクトを作成すると、すべての新しいメンバーが配列に追加されます。

于 2013-09-27T15:54:07.913 に答える