我有一个要重新格式化为新的键值对的json数据。我正在使用以下JavaScript代码来格式化json数据。
const input = {
"file1": {
"function1": {
"calls": {
"405:4": {
"file": "file1",
"function": "function2"
},
"406:4": {
"file": "file1",
"function": "function3"
}
}
},
"function2": {
"calls": {
"397:7": {
"file": "file2",
"function": "function1"
}
}
},
"function3": {
"calls": null
},
"function4": {
"calls": null
}
},
"file2": {
"function5": {
"calls": {
"43:4": {
"file": "file2",
"function": "function5"
}
}
},
"function6": {
"calls": {
"32:4": {
"file": "file1",
"function": "function1"
}
}
}
}
}
function transformData(data) {
let res = [];
let calls = [];
Object.entries(data).map(([fileName, fileObject]) => {
Object.entries(fileObject).map(([functionName, functionObject]) => {
Object.entries(functionObject).map(([functionKey, functionValue]) => {
if(functionKey === "calls") {
Object.entries(functionValue).map(([callKey, callObject]) => {
calls = [...calls, callObject['file']+"."+callObject['function']]
});
}
});
res = [...res,{"name": fileName+"."+functionName, "import": calls}]
});
});
return res;
}
const sanitize = (obj) => {
return JSON.parse(JSON.stringify(obj, (key, value) => {
return (value === null ? undefined : value);
}));
};
const data = sanitize(input)
const result = transformData(data);
console.log(result)
我预期的json数据如下:
[
{
"name": "file1.function1",
"imports": [
"file1.function2",
"file1.function3"
]
},
{
"name": "file1.function2",
"imports": [
"file2.function1"
]
},
{
"name": "file1.function3",
"imports": []
},
{
"name": "file1.function4",
"imports": []
},
{
"name": "file2.function5",
"imports": [
"file2.function5"
]
},
{
"name": "file2.function6",
"imports": [
"file1.function1"
]
}
]
我的输出不正确。尽管它使用名称和导入键给出了正确数量的主数组,但是导入数组是错误的。
有人可以帮我吗。我认为我没有以正确的方式退还它。
您做的错误是,您每次都将相同的calls
数组分配给import
,并且没有在后续迭代中清除过去的元素。替换为该代码以获得预期的结果。
function transformData(data) {
let res = [];
Object.entries(data).map(([fileName, fileObject]) => {
Object.entries(fileObject).map(([functionName, functionObject]) => {
let calls = []; // Notice this line. I'm creating new array for every iteration. Another way is to clear the array before proceeding.
Object.entries(functionObject).map(([functionKey, functionValue]) => {
if(functionKey === "calls") {
Object.entries(functionValue).map(([callKey, callObject]) => {
calls = [...calls, callObject['file']+"."+callObject['function']]
});
}
});
res = [...res,{"name": fileName+"."+functionName, "import": calls}]
});
});
return res;
}