Подтвердить что ты не робот

Push перезаписывает предыдущие данные в массиве

Я передаю строку, которая выглядит примерно так: "John.Doe.100.Newbie-David.Miller.250.Veteran-" для функции SplitDatabase, которая соответствующим образом разделяет строку и присваивает значения объекту UserDataEntry. Затем объект UserDataEntry вводится в глобальный массив UserData, который должен хранить все пользовательские данные.

По какой-то причине часть UserData.push(UserDataEntry), по-видимому, перезаписывает предыдущие данные в массиве UserData. Предупреждение в 1-м цикле показывает правильные данные, когда они петли, но предупреждение во втором цикле внизу просто показывает последнюю запись снова и снова.

Я не уверен, почему это?

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

}
4b9b3361

Ответ 1

Вызов push не будет копировать ваш объект, потому что JavaScript Object передается по ссылке: вы нажимаете те же самые Object как на каждую запись массива.

Вы можете легко это исправить, перемещая var UserDataEntry = {}; внутри тела цикла, чтобы каждый объект был создан каждый новый цикл:

    for (var x = 0; x < (tempUserData.length); x++) {
         var UserDataEntry = {};

Ответ 2

Поместите свою строку var UserDataEntry = {} внутри цикла for.

Прямо сейчас у вас есть только один объект, и вы настраиваете каждую часть массива на этот объект. Вы перезаписываете элементы в своем цикле.

Если вы создадите новый объект внутри цикла, вы добавите все новые элементы в массив.

Ответ 3

var UserDataEntry = {}; - {} очень важен.

var UserDataEntry; - Если мы поставим это в цикле, у вас будет такая же проблема.