Я пытаюсь переместить значение в родительский узел в чистой функции - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть JSON (сгенерированный giftpeg ), и есть некоторые бесполезные для меня узлы, такие как "format:" moodle "(см. Код):

[ 
   { 
       "type": "MC", 
       "title": null, 
       "stem": 
           { 
               "format":"moodle", 
               "text": "What is the main cause of the seasons on the earth?" 
           }, 
           "hasEmbeddedAnswers": false, 
           "globalFeedback": null, 
           "choices": 
           [ { 
               "isCorrect": false, 
               "weight": null, 
               "text": 
               { 
                   "format": "moodle", 
                   "text": "the earth's elliptical (slightly oval) orbit around the sun" }, "feedback": null 
               }, 
               { 
                   "isCorrect": true, 
                   "weight": null, 
                   "text": 
                       { "format": "moodle",
                        "text": "the tilt of earth's axis with respect to the sun"
                       },
                       "feedback": null 
               }, 
               { 
                   "isCorrect": false, 
                   "weight": null, 
                   "text": 
                   { 
                       "format": "moodle", 
                       "text": "the northern hemisphere has twice the land mass than the southern hemisphere"
                   }, 
                   "feedback": null
               } 
           ]
   } 
]

До сих пор я могу удалить «форматирующие» узлы (я думаю, что я делаю это правильно), но есть некоторая избыточность, такая как:

"text":{
    "text": "foo"
}

цель состоит в том, чтобы преобразовать его (неразрушающим образом) в:

"text": "foo"

Это мой код (пытаюсь быть настолько функциональным, насколько я могу):

            formatedQuestions(jsonItem) {
            return jsonItem.map(question => {
                question.choices.map(choice => {
                    delete choice.text.format;
                    choice = Object.assign(choice, choice.text);
                    delete choice.text.text;
                    return choice;
                });
                delete question.stem.format;
                return question;
            });

Я могу переместить его, но он изменит исходный JSON. Поэтому каждый раз, когда я его называюизменения. И это проблема.

Это перемещает значение «вверх», но это то, что меняет оригинал

 choice = Object.assign(choice, choice.text);

Если у вас есть какие-либо предложения, помимо решения, чтобы сделать его более функциональными эффективный будет с благодарностью.

1 Ответ

1 голос
/ 12 апреля 2019
 const formatObj = obj => obj.format === "moodle" ? obj.text : Object.entries(obj).reduce((res, [key, value]) => ({ ...res, [key]: format(value) }), {});

 const formatArray = array => array.map(format);

 const format = it => (
   Array.isArray(it) && formatArray(it) ||
   typeof it === "object" && formatObj(it) ||
   it
 );

Это функционально, является ли оно «эффективным» или даже «читаемым», это другое дело.

Как я обычно это делаю:

 function format(it) {
   if(Array.isArray(it))
     return it.map(format);

   if(typeof it === "object") {
     if(it.format === "moodle")
       return it.text;

     const result = {};
     for(const [key, value] of Object.entries(it))
        result[key] = format(value);
     return result;
   }

   return it;
}

Если вам не нужно универсальное решение, вот конкретное для вашего варианта использования:

 formatedQuestions(jsonItem) {
    return jsonItem.map(question => ({
       ....question,
       stem: question.stem.text,
       choices: question.choices.map(choice => ({
         ...choice,
         text: choice.text.text || choice.text,
       })),
   }));
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...