Застрял: обновление ключа / значений в экземпляре объекта JSON без удаления других характеристик - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь обновить элементы в существующем экземпляре объекта.Когда я это делаю, некоторые из того, что я предполагаю, являются унаследованными характеристиками, которые отображаются в proto в Chrome Dev Tools.

//this is a Chrome Dev Tools view of the instantiated object I attempted to update/modify; 
//this is rejected by a later function I'm using in the xAPI tincan-min.js library

statement.target.definition.choices: Array(5)
0:
description: {en-US: "Apple"}
id: "kcContent.questions[3].answerChoices[0]"
__proto__:
constructor: ƒ Object()
hasOwnProperty: ƒ hasOwnProperty()
isPrototypeOf: ƒ isPrototypeOf()
propertyIsEnumerable: ƒ propertyIsEnumerable()
toLocaleString: ƒ toLocaleString()
toString: ƒ toString() 
valueOf: ƒ valueOf()
__defineGetter__: ƒ __defineGetter__()
__defineSetter__: ƒ __defineSetter__()
__lookupGetter__: ƒ __lookupGetter__()
__lookupSetter__: ƒ __lookupSetter__()
get __proto__: ƒ __proto__()
set __proto__: ƒ __proto__()


//this is a Dev Tools view of a "placeholder" instantiated objects
1: TinCan.InteractionComponent   // how do I preserve the 'TinCan.InteractionComponent' characteristic when I update this instanced object?
description: {en-US: "pending"}
id: "pending"
__proto__:
LOG_SRC: "InteractionComponent"  
asVersion: ƒ (a)
getLangDictionaryValue: ƒ (a,b)
init: ƒ (a)
log: ƒ (a,b)
__proto__: Object


//these are additional "placeholder" objects--all of which have the "TinCan.InteractionComponent" prefix, which is what I'm losing when I try to update elements using the function below

2: TinCan.InteractionComponent {id: "pending", description: {…}}
3: TinCan.InteractionComponent {id: "pending", description: {…}}
4: TinCan.InteractionComponent {id: "pending", description: {…}}
length: 5
__proto__: Array(0)
//This is the function I'm using to update the instantiated object:

    function populateStatementChoices(callback){ 
        console.log("Populating statement choices.");
        statement.target.definition.choices.forEach(function(item, index) {
            function setStatementChoiceID(num){
                //this updates the key/values but removes 'TinCan.InteractionComponent' from the object
                statement.target.definition.choices[num] = {
                    id:"kcContent.questions[" + choiceQuestionIndex + "].answerChoices[" + num + "]",
                    description:{"en-US":kcContent.questions[choiceQuestionIndex].answerChoices[num].choiceText},
                }
                setStatementChoiceID(index);
        });
        if (typeof callback === 'function'){
            callback();
        }
    };

Сохранение характеристик "TinCan.InteractionComponent" - вот чтоЯ не могу понять.Надеюсь, кто-то видел это раньше и может указать мне правильное направление.Спасибо за ваше время и внимание;Я ценю это больше, чем ты знаешь!

1 Ответ

0 голосов
/ 25 марта 2019

Вы теряете "TinCan.InteractionComponent", потому что вы устанавливаете позицию массива как новый объект.

statement.target.definition.choices = [ ..., ..., ..., ...]

//your code says, access the array position at number and assign (=) whatever is below to it.

statement.target.definition.choices[num] = {
                    id:"kcContent.questions[" + choiceQuestionIndex + "].answerChoices[" + num + "]",
                    description:{"en-US":kcContent.questions[choiceQuestionIndex].answerChoices[num].choiceText},
                }

Прежде всего вы должны переписать свою функцию. Вы не используете forEach должным образом. Я бы порекомендовал использовать map, потому что он не изменяет массив, но для простоты ваш код может быть упрощен до:

       function populateStatementChoices(callback){ 

            console.log("Populating statement choices.");
            statement.target.definition.choices.forEach(function(item, index) {

            item.id = "kcContent.questions[" + choiceQuestionIndex + "].answerChoices[" + index+ "]";
        item.description = { "en-US": kcContent.questions[choiceQuestionIndex].answerChoices[index].choiceText};
}
            if (typeof callback === 'function'){
                callback();
            }
        };

При этом вы должны хорошо идти с обновлением, не теряя другие свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...