通过JavaScript修改Json数据以创建新对象
我有一个json数据,如下所示通过JavaScript修改Json数据以创建新对象,javascript,arrays,json,object,Javascript,Arrays,Json,Object,我有一个json数据,如下所示 { "file1": { "function1": { "calls": { "439:0": [ "441:24" ], "441:24": [ "443:4" ], "443:4": [ "447:7", "445:10" ], "445:10":
{
"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"
]
}
}
}
}
我需要将其转换为函数1的以下格式
{
"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"
}
]
}
其中,调用键是节点中的line和id以及链接中的source。目标是调用中的值。如果任何键有多个值,而不是每个值,它将创建一个源-目标对
这将在以后用作data.nodes.mapfunctiond{return d.line}
我尝试了以下代码,但它不能正常工作。它提供了一个包含正确信息的数组,但我需要在后续步骤中使用它,它在那里不起作用。类型“any[]”上不存在属性“nodes”之类的给定错误
有人请帮忙。谢谢您的时间。您可以省略不需要的属性,只需执行一次嵌套操作,然后通过检查现有节点来构建一组新节点,并且无需进一步检查即可分配所有链接 函数getNodesLinksobject,结果={节点:[],链接:[]}{ if object.calls===null返回结果; if!object.calls{ Object.valuesobject.forEachv=>getNodesLinksv,结果; 返回结果; } Object.entriesobject.calls.forEach[源,目标]=>{ if!result.nodes.some{id}=>id==source{ push{id:source,line:source}; } targets.forEachtarget=>{ if!result.nodes.some{id}=>id==target{ push{id:target,line:target}; } result.links.push{source,target}; }; }; 返回结果; } var data={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:[395:27]},function3:{calls:null},function4:{calls:null},function2:{calls:null},function2:[398:[398:0:{, 393:8: [397:7], 397:7: [395:27] } } } }, 结果=getNodesLinksdata; console.logresult;
.作为控制台包装器{max height:100%!important;top:0;}您可以试试这个,它应该可以正常工作
var res = {};
var nodes = [];
var Links = [];
var 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"]}}}}';
var jsonObj = JSON.parse(json);
if ("function1" in jsonObj.file1) {
if ('calls' in jsonObj.file1.function1) {
for (var i = 0; Object.keys(jsonObj.file1.function1.calls).length > i; i++) {
nodes.push({ "id": Object.keys(jsonObj.file1.function1.calls)[i], "line": Object.keys(jsonObj.file1.function1.calls)[i] });
for (var j = 0; Object.values(jsonObj.file1.function1.calls)[i].length > j; j++) {
Links.push({ "source": Object.keys(jsonObj.file1.function1.calls)[i], "target": Object.values(jsonObj.file1.function1.calls)[i][j] });
}
}
res = { "nodes": nodes, "links": Links }
console.log(res);
}
}
给定的数据是否与所需的结果匹配?您从何处获取键/值?我尝试将其构建为所需的格式,其中包含节点和链接。我当前的结果包含信息,但方式不正确。它在请求对象,而我的在数组中。我看不到您的输入和输出之间有明确的联系。例如,191在输出中,而不是输入中。你能提供一个你想要实现的算法的描述吗?我已经更新了目标数据。在目标中的类型“unknown”上不存在作为属性“forEach”的给定错误。forEachtarget=>{….line!你有什么类型的目标?它在这里对堆栈片段有效吗?请添加准确的错误消息。
var res = {};
var nodes = [];
var Links = [];
var 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"]}}}}';
var jsonObj = JSON.parse(json);
if ("function1" in jsonObj.file1) {
if ('calls' in jsonObj.file1.function1) {
for (var i = 0; Object.keys(jsonObj.file1.function1.calls).length > i; i++) {
nodes.push({ "id": Object.keys(jsonObj.file1.function1.calls)[i], "line": Object.keys(jsonObj.file1.function1.calls)[i] });
for (var j = 0; Object.values(jsonObj.file1.function1.calls)[i].length > j; j++) {
Links.push({ "source": Object.keys(jsonObj.file1.function1.calls)[i], "target": Object.values(jsonObj.file1.function1.calls)[i][j] });
}
}
res = { "nodes": nodes, "links": Links }
console.log(res);
}
}