通过JavaScript修改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":

我有一个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"
        ]
      }
    }
  }
}
我需要将其转换为函数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);
                }
            }