Пройдите по N-арной древовидной структуре в javascript - PullRequest
0 голосов
/ 27 декабря 2018

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

[{
    "title": "26 - India",
    "tooltip": "26 - India",
    "children": [
      {
        "title": "026 - MH",
        "tooltip": "026 - MH",
        "children": [
          {
            "title": "2018",
            "tooltip": "2018",
            "children": []
          }
        ]},
      {
        "title": "026 - GJ",
        "tooltip": "026 - GJ",
        "children": [
          {
            "title": "2018",
            "tooltip": "2018",
            "children": []
          }
        ]},
      {
        "title": "026 - UP",
        "tooltip": "026 - UP",
        "children": [
          {
            "title": "2018",
            "tooltip": "2018",
            "children": []
          }
        ]}
    ]},
  {
    "title": "27 - USA",
    "tooltip": "27 - USA",
    "children": [
      {
        "title": "027 - SA",
        "tooltip": "027 - SA",
        "children": [
          {
            "title": "2018",
            "tooltip": "2018",
            "children": []
          }]
      }]
  }]

и поиск результата как:

26 - India & 026 - MH & 2018
26 - India & 026 - GJ & 2018
26 - India & 026 - UP & 2018
27 - USA & 027 - SA & 2018

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

var title= "";

searchTree(tree);
function searchTree(tree) {

  tree.map(function(item){
   if(item.children.length >0){
        title = title + " & "+ item.title;  
      searchTree(item.children)
    }
    else{
      title = title + " & " + item.title;
        console.log(title);
        title = "";
    }
  })
 }

Но этот результат выглядит следующим образом:

& 26 - India & 026 - MH & 2018
& 026 - GJ & 2018
& 026 - UP & 2018
& 27 - USA & 027 - SA & 2018

Родитель с более чем одним ребенком здесь не записывается.

Любая помощь будет оценена.Заранее спасибо!

1 Ответ

0 голосов
/ 27 декабря 2018

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

  • При работе со списками используйте массивы как можно дольше.Это делает ваши функции более гибкими в долгосрочной перспективе.
  • При работе с рекурсивными функциями передача списка результатов вниз является самым простым способом отслеживания всего этого.Не полагайтесь на глобальные переменные, если вы можете избежать этого.
  • Расширяя предыдущий пункт, помните, что непростые переменные, такие как массивы, передаются по ссылке, а не по копии.Вы можете обойти это, используя Slice в своих массивах перед их передачей.

Вот мой взгляд на вашу проблему:

function overviewEndpoints(data, titles, endpoints) {
    if (titles === void 0) { titles = []; }
    if (endpoints === void 0) { endpoints = []; }
    titles.push(data.title);
    if (data.children.length > 0) {
        data.children
            .forEach(function (child) {
            overviewEndpoints(child, titles.slice(0), endpoints);
        });
    }
    else {
        endpoints.push(titles.slice(0));
    }
    return endpoints;
}
//TEST
var data = [
    {
        "title": "26 - India",
        "tooltip": "26 - India",
        "children": [
            {
                "title": "026 - MH",
                "tooltip": "026 - MH",
                "children": [
                    {
                        "title": "2018",
                        "tooltip": "2018",
                        "children": []
                    }
                ]
            },
            {
                "title": "026 - GJ",
                "tooltip": "026 - GJ",
                "children": [
                    {
                        "title": "2018",
                        "tooltip": "2018",
                        "children": []
                    }
                ]
            },
            {
                "title": "026 - UP",
                "tooltip": "026 - UP",
                "children": [
                    {
                        "title": "2018",
                        "tooltip": "2018",
                        "children": []
                    }
                ]
            }
        ]
    }, {
        "title": "27 - USA",
        "tooltip": "27 - USA",
        "children": [
            {
                "title": "027 - SA",
                "tooltip": "027 - SA",
                "children": [
                    {
                        "title": "2018",
                        "tooltip": "2018",
                        "children": []
                    }
                ]
            }
        ]
    }
];
console.log(data.map(function (a) { return overviewEndpoints(a).map(function (a) { return a.join(" & "); }).join("\n"); }).join("\n\n"));

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...