Можно ли получить текущий ключ newAchievements в цикле for для (var key в достижении объекта) после строки newAchievements.push?

Например, если ключ достижений - «Уровень завершения 1», возможно ли вернуть текущий ключ newAchievements (в данном случае это будет 0) после строки newAchievements.push в том же цикле for?

Прямо сейчас я получаю это исключение JavascriptException:

"StackTrace": "TypeError: Cannot read property 'achievement' of undefined\n    at handlers.UpdateAchievementsReadOnlyData (...-main.js:24:34)\n    at Object.invokeFunction (Script:116:33)"

Мне нужно обновить значение достижения «Level1FinishTimes» с помощью server.UpdateUserReadOnlyData (MyRequest); прежде чем я вызову ChooseanAchievement () для следующей пары ключ / значение.

Можно ли получить текущий ключ newAchievements в цикле for? Если нет, то как лучше всего обновить значение достижения (с помощью server.UpdateUserReadOnlyData (MyRequest);), прежде чем я вызову ChooseanAchievement () для следующей пары ключ / значение?

handlers.UpdateAchievementsReadOnlyData = function (args, context)
{
    var achievementObject = args.AchievementObject;
    var achievementKeys = [];
    var newAchievements = [];

    for (var key in achievementObject)
    {
        achievementKeys.push(key);
    };

    log.info(achievementKeys);

    var getUserReadOnlyDataResult = server.GetUserReadOnlyData({ PlayFabId: currentPlayerId, Keys: achievementKeys });

    for (var key in achievementObject)
    {
        log.info("achievementObject[key]--->" + achievementObject[key]);
        newAchievements.push(ChooseanAchievement(getUserReadOnlyDataResult, key, achievementObject[key]));

    if (newAchievements[key].achievement != "")
    {
        log.info("newAchievements.achievement " + newAchievements[key].achievement, "newAchievements.addvalue " + newAchievements[key].addvalue);
        var MyRequest = {
            PlayFabId: currentPlayerId,
            Data: {},
            Permission: UserDataPermission.Public
        };

        MyRequest.Data[newAchievements[key].achievement] = newAchievements[key].addvalue;
        server.UpdateUserReadOnlyData(MyRequest);

        log.info("Updating achievement " + newAchievements[key].achievement + " was succuessful.");
    }
    else
    {
        log.info("Could not find this achievement.");
    }
};

}

function ChooseanAchievement(result, achievementkey, achievementvalue)
{
    switch (achievementkey)
    {
        case "Level1FinishTimes":
            if (result.Data.hasOwnProperty(achievementkey))
            {
                if ((result.Data[achievementkey].Value != null) && (result.Data[achievementkey].Value != ""))
                {
                    if (Number(achievementvalue) == 1)
                    {
                        log.info("Level1FinishTimes ok" + achievementkey + achievementvalue);
                        return { achievement: achievementkey, addvalue: Number(result.Data[achievementkey].Value) + Number(achievementvalue) };
                    }
                    else
                    {
                        log.info("Level1FinishTimes" + achievementkey + achievementvalue);
                        return { achievement: achievementkey, addvalue: result.Data[achievementkey].Value };
                    }
                }
                else
                    return { achievement: "", addvalue: false };
            }
            else
                return { achievement: "", addvalue: false };
            break;

        case "Finish level 1 three times":
            var resultdatalevel1finish = server.GetUserReadOnlyData({ PlayFabId: currentPlayerId, Keys: ["Level1FinishTimes"] });

            if (resultdatalevel1finish.Data.hasOwnProperty("Level1FinishTimes"))
            {
                if ((resultdatalevel1finish.Data.Level1FinishTimes.Value != null) && (resultdatalevel1finish.Data.Level1FinishTimes.Value != ""))
                {
                    if ((Number(resultdatalevel1finish.Data.Level1FinishTimes.Value) >= 3)  && (achievementvalue == true))
                    {
                        log.info("Finish level 1 three times ok" + achievementkey + achievementvalue);
                        return { achievement: achievementkey, addvalue: achievementvalue };
                    }
                    else
                    {
                        log.info("Finish level 1 three times" + achievementkey + achievementvalue);
                        return { achievement: achievementkey, addvalue: result.Data[achievementkey].Value };
                    }
                }
                else
                    return { achievement: "", addvalue: false };
            }
            else
                return { achievement: "", addvalue: false };
            break;
            //...
    }
}
1
Hobbit7

1 ответ

Похоже, вы неправильно поняли термины key и index массива. Вы помещаете элемент в массив. Вам нужно использовать index , чтобы получить элемент массива, например, < Код > fooData [ 0 ] :

const fooData = [
    {'Finish level 0': 0, test1: 0},
    {'Finish level 1': 1, test1: 1},
    {'Finish level 2': 2, test1: 2},
];

fooData.push({'Finish level 3': 0, test1: 3});

// To get newly pushed item of array:
const maxIndex = fooData.length - 1;
console.log(`Newly pushed item of array:`, fooData[maxIndex]);

Тем не менее, вы можете иметь ключ в массиве. Вам нужно использовать key , чтобы получить элемент массива, например, < Код > fooData [ ' someKeyOfAnArray '] :

const fooData = [
  {'Finish level 0': 0, test1: 0},
  {'Finish level 1': 1, test1: 1},
  {'Finish level 2': 2, test1: 2},
];

// To get an object by key from an array
fooData['someKeyOfAnArray'] = {'message': 'This is a message'};
console.log(`// Object by key from an array: `, fooData['someKeyOfAnArray']);
58591503