我正在尝试将JSON转换为对象数组。
So far I have this working code where params data
is the JSON. It could be deeply nested, provided a properties
key exists.
Therefore in the code below if a properties
key exists, loop over it and build an array of objects.
将其转换为递归函数的好方法是什么。到目前为止,我微弱的尝试一直缺乏光泽。
const rec = (data: Object) => {
let obj1;
for (const k in data) {
obj1 = this.buildPropertyObj(data, k);
if (data[k].properties) {
let obj2;
obj1.items = [];
for (const j in data[k].properties) {
obj2 = this.buildPropertyObj(data[k].properties, j);
if (data[k].properties[j].properties) {
obj2.items = [];
for (const i in data[k].properties[j].properties) {
obj2.items.push(this.buildPropertyObj(data[k].properties[j].properties, i));
}
}
obj1.items.push(obj2)
}
}
}
items.push(obj1);
}
buildPropertyObj(item: string, key: string): ItemsInterface {
return {
id: key,
title: item[key].title,
description: item[key].description
};
}
例如,我编写了此递归函数,该函数将JSON的精确副本复制到对象数组中,但它不保留嵌套,只是一个平面数组。我一直在努力写一些干净的东西来保持嵌套,但是到目前为止还没有运气... :(
buildForm(): JsonFormInterface {
const listItems: any = [];
const recursiveBuild = (items: any, listItems: Array<any>): void => {
for (const key in items) {
listItems.push(this.buildPropertyObj(items, key));
recursiveBuild(items[key].properties, listItems);
}
};
recursiveBuild(this.formSchema.properties, listItems);
return { title: this.formSchema.title, items: listItems };
}
JSON:
{
"group_container1": {
"type": "object",
"title": "Container 1 Group",
"description": "Awesome description here.",
"properties": {
"group_1": {
"type": "object",
"title": "Container 1 Group 1",
"description": "Awesome description here.",
"properties": {
"C_1_G_1_Item_1": {
"title": "Container 1 Group 1 Item 1",
"description": "This is a select box",
"type": "string",
"enum": ["Option 1a", "Option 2b"]
},
"C_1_G_1_Item_2": {
"title": "Container 1 Group 1 Item 2",
"description": "This is a select box",
"type": "string",
"enum": []
},
"C_1_G_1_Item_3": {
"title": "Container 1 Group 1 Item 3",
"description": "This is a select box",
"type": "string",
"enum": [],
"properties": {
"boom": {
"title": "Boom !",
"description": "This is a select box",
"type": "string",
"properties": {
"bam": {
"title": "Bam !",
"description": "This is a select box",
"type": "string"
}
}
}
}
}
}
}
}
}
}
预期结果:
{
"title": "Container 1 Group",
"description": "Awesome description here.",
"items": [
{
"id": "group_1",
"title": "Container 1 Group 1",
"description": "Awesome description here.",
"items": [
{
"id": "C_1_G_1_Item_1",
"title": "Container 1 Group 1 Item 1",
"description": "This is a select box",
},
{
"id": "C_1_G_1_Item_2",
"title": "Container 1 Group 1 Item 2",
"description": "This is a select box",
},
{
"id": "C_1_G_1_Item_3",
"title": "Container 1 Group 1 Item 3",
"description": "This is a select box",
"items": [
{
"id": "boom",
"title": "Boom !",
"description": "This is a select box",
items: [
{
"id": "bam",
"title": "Bam !",
"description": "This is a select box",
}
]
}
]
}
]
}
]
}