Подниматься и добавлять вложенные объекты / массив - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь понять, как рекурсивно добавлять ветвящиеся структуры к объекту.

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

nodeStructure: {
    text: { name: "Parent node" },
    children: [
        {
            text: { name: "First child" },
            children: [
                {
                  text: {name: "Grandchild"}
                }
            ]
        },
        {
            text: { name: "Second child" }
        }
    ]
}

Вот самая краткая версия этого кода.

trackFraud = async (fraudID) => {

  var root = chart_config.nodeStructure = newNode(fraudID);

  await fraudClimb(root, 1);

  var my_chart = new Treant(chart_config);

  function newNode(node) { return {text:{name:"fraud " + node}}; }

  async function fraudClimb(root, fraudID) {    
    var frauds = await findFraudByFromID.call(this, fraudID); // returns an array of "integers"

    if (frauds.length == 0) return;

    var children = root.children = [];
    for (var i = 0; i < frauds.length; i++) {
      children.push(newNode(frauds[i]));
      fraudClimb(children[i], frauds[i]);
    }   
  }
}

Теперь я пытаюсь обернуть голову, как пройти, или в этом случае добавить, структуру, которая чередует все остальныеуровень между массивами и объектами

Полагаю, реальный вопрос в том, как рекурсивно передать объект и добавить к этому исходному объекту.

1 Ответ

0 голосов
/ 01 марта 2019

Я вижу две проблемы в вашем коде:

  1. При первом вызове fraudClimb игнорируется доступный параметр fraudID.Вместо:

    await fraudClimb(root, 1);
    

    Я думаю, вам нужно:

    await fraudClimb(root, fraudID);
    
  2. Рекурсивный вызов fraudClimb не ожидается, но вам нужна асинхронная операция длязавершить, прежде чем продолжить.Поэтому измените это:

    fraudClimb(children[i], frauds[i]);
    

    на:

    await fraudClimb(children[i], frauds[i]); 
    
...