Reputation: 10010
I am trying to restructure a nested object:
Input
{
"elements":[
{
"name":"catalog",
"elements":[
{
"name":"book",
"elements":[
{
"name":"author",
"elements":[
{
"type":"text",
"text":"Gambardella, Matthew"
}
]
},
{
"name":"title",
"elements":[
{
"text":"XML Developers Guide"
}
]
}
]
}
]
}
]
}
Desired output
{
"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"}
}
]
}
]
}
]
}
]
}
I have tried this so far
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]);
});
Upvotes: 0
Views: 77
Reputation: 351403
You could use this (arrow) function which uses spread syntax in object literals (ES2018):
const arrange = obj => obj.elements ? {
..."name" in obj && { 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));
If you also need to convert the existing "text" properties in the leaf-nodes (it is ambiguous in your output):
const arrange = obj => ({
..."type" in obj && { type: obj.type },
..."name" in obj && { text: { name: obj.name } },
..."text" in obj && { text: { name: obj.text } },
..."elements" in obj && { 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));
Upvotes: 1