Измените данные Json для создания нового объекта с помощью JavaScript - PullRequest
0 голосов
/ 27 января 2020

У меня есть 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)

Кто-то, пожалуйста, помогите. Спасибо за ваше время.

Ответы [ 2 ]

1 голос
/ 27 января 2020

Вы могли бы пропустить ненужные свойства и использовать один раз для создания нового набора узлов, проверяя существующие узлы и назначая все ссылки без дальнейшей проверки.

function getNodesLinks(object, result = { nodes: [], links: [] }) {
    if (object.calls === null) return result;
    if (!object.calls) {
        Object.values(object).forEach(v => getNodesLinks(v, result));
        return result;
    }
    Object.entries(object.calls).forEach(([source, targets]) => {
        if (!result.nodes.some(({ id }) => id === source)) {
            result.nodes.push({ id: source, line: source });
        }
        targets.forEach(target => {
            if (!result.nodes.some(({ id }) => id === target)) {
                result.nodes.push({ id: target, line: target });
            }
            result.links.push({ source, target });
        });
    });
    return result;
}

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"], "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"] } } } },
    result = getNodesLinks(data);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 27 января 2020

Вы можете попробовать это, это должно работать нормально.

           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);
                }
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...