У меня есть json данные в следующем виде
{
"file1": {
"function1": {
"calls": {
"439:0": [
"441:24"
],
"441:24": [
"443:4"
],
"443:4": [
"447:7",
"445:10"
],
"445:10": [
"449:4"
],
"447:7": [
"449:4"
]
}
},
"function2": {
"calls": {
"391:0": [
"393:8"
],
"393:8": [
"397:7"
],
"397:7": [
"395:27"
]
}
},
"function3": {
"calls": null
},
"function4": {
"calls": null
}
},
"file2": {
"function5": {
"calls": null
},
"function6": {
"calls": {
"391:0": [
"393:8"
],
"393:8": [
"397:7"
],
"397:7": [
"395:27"
]
}
}
}
}
Мне нужно преобразовать их в следующем формате для "function1"
{
"nodes": [
{
"id": "439:0",
"line": "439:0"
},
{
"id": "441:24",
"line": "441:24"
},
{
"id": "443:4",
"line": "443:4"
},
{
"id": "447:7",
"line": "447:7"
},
{
"id": "445:10",
"line": "445:10"
},
{
"id": "449:4",
"line": "449:4"
}
],
"links": [
{
"source": "439:0",
"target": "441:24"
},
{
"source": "441:24",
"target": "443:4"
},
{
"source": "443:4",
"target": "447:7"
},
{
"source": "443:4",
"target": "445:10"
},
{
"source": "445:10",
"target": "449:4"
},
{
"source": "447:7",
"target": "449:4"
}
]
}
Где клавиши "call" - это строки и идентификатор в «узлах» и источник в «ссылках». Цели - это значения внутри вызовов. Если какой-либо ключ имеет несколько значений, чем для каждого значения, он создаст пару источник-цель.
Это будет использоваться позже как data.nodes.map(function(d){return d.line})
Я пробовал следующий код, но он не работает должным образом. Это дает массив с правильной информацией, но способ, которым мне нужно использовать его в дальнейших шагах, он не работает там. Это дает ошибки как Property 'nodes' does not exist on type 'any[]'
.
let res = {}
let nodes = []
let links = []
Object.entries(input0).map(([fileName, fileObject]) => {
Object.entries(fileObject).map(([functionName, functionObject]) => {
if(functionName=="function1"){
Object.entries(functionObject).map(([functionKey, functionValue]) => {
if(functionKey === "calls") {
if(functionValue != null){
Object.entries(functionValue).map(([callKey, callObject]) => {
nodes = [...nodes,{"id": callKey, "line": callKey}]
callObject.forEach(x => {
links = [...links,{"source": callKey, "target": x}]
});
res = {"nodes": nodes, "links": links} //nodes.concat(links)
})
}
}
})
}
})
})
console.log(res)
Кто-то, пожалуйста, помогите. Спасибо за ваше время.