#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. Идеальный. Именно то, что я хотел.