Форматирование объекта

#javascript #jquery

#javascript #jquery

Вопрос:

Я пытаюсь реструктурировать вложенный объект:

Ввод

 {
   "elements":[
      {
         "name":"catalog",
         "elements":[
            {
               "name":"book",
               "elements":[
                  {
                     "name":"author",
                     "elements":[
                        {
                           "type":"text",
                           "text":"Gambardella, Matthew"
                        }
                     ]
                  },
                  {
                     "name":"title",
                     "elements":[
                        {
                           "text":"XML Developers Guide"
                        }
                     ]
                  }
               ]
            }
         ]
      }
   ]
}
  

Желаемый результат

  {
       "children":[
          {
             "text": {"name":"catalog"},
             "children":[
                {
                   "text": {"name":"book"},
                   "children":[
                      {
                         "text": {"name":"author"},
                         "children":[
                            {
                               "type":"text",
                               "text":"Gambardella, Matthew"
                            }
                         ]
                      },
                      {
                         "text": {"name":"title"},
                         "children":[
                            {
                               "text": {"name": "XML Developers Guide"}
                            }
                         ]
                      }
                   ]
                }
             ]
          }
       ]
    }
  

Я уже пробовал это до сих пор

     function createJsonStructure(obj) {
        for (var i = 0; i < obj.elements.length;   i) {
            console.log(obj.name);
            if(obj.elements[i].elements) {
                for (var ii = 0; ii < obj.elements[i].elements.length;   ii) {
                    createJsonStructure(obj.elements[i].elements[ii]); 
                }
            } else {
                console.log(obj.elements[i].text);
            } 
        }
    };

   $(function(){
        createJsonStructure(xmlToJson.elements[0]);
    });
  

Комментарии:

1. @trincot ошибка и изменен.

2. Какова логика того, чтобы иметь "text":"Gambardella, Matthew" в вашем выводе, с одной стороны, и "text": {"name": "XML Developers Guide"} с другой?

Ответ №1:

Вы могли бы использовать эту функцию (стрелка), которая использует расширенный синтаксис в объектных литералах (ES2018):

 const arrange = obj => obj.elements ? {
        ..."name" in obj amp;amp; { text: { name: obj.name } },
        children: obj.elements.map(arrange)
    } : {...obj};

// Sample:
const data = {"elements":[{"name":"catalog","elements":[{"name":"book","elements":[{"name":"author","elements":[{"type":"text","text":"Gambardella, Matthew"}]},{"name":"title","elements":[{"text":"XML Developers Guide"}]}]}]}]};

console.log(arrange(data));  

Если вам также необходимо преобразовать существующие «текстовые» свойства в конечных узлах (это неоднозначно в вашем выводе):

 const arrange = obj => ({
        ..."type" in obj amp;amp; { type: obj.type },
        ..."name" in obj amp;amp; { text: { name: obj.name } },
        ..."text" in obj amp;amp; { text: { name: obj.text } },
        ..."elements" in obj amp;amp; { children: obj.elements.map(arrange) }
    });

// Sample:
const data = {"elements":[{"name":"catalog","elements":[{"name":"book","elements":[{"name":"author","elements":[{"type":"text","text":"Gambardella, Matthew"}]},{"name":"title","elements":[{"text":"XML Developers Guide"}]}]}]}]};

console.log(arrange(data));  

Комментарии:

1. Идеальный. Именно то, что я хотел.