Как алгоритмы рекурсивного дерева реализованы во вложенном рекурсивном массиве - PullRequest
4 голосов
/ 02 мая 2019

Существует Массив, который вдохновлен объектом хэш-дерева.Но структура не очень хорошо спроектирована и немного сложна.

const directories = [
  "/main",
  [
    "folder",
    ["subFolder", ["directory1", "directory2", "directory3"]],
    "folder2",
    ["subFolder", ["directory4", "directory5"]],
    "folder3",
    [
      "subFolder",
      ["directory4", "directory5", "directory6", "directory7"],
      "subFolderWrapper",
      ["folder1", ["subFolder", ["child1", "child2", "child3", "child4"]]]
    ]
  ]
]

Необходимо создать рекурсивную функцию и вернуть новый массив на основе вложенных отношений из заданного.

что-то вроде этого
const result = [
  "/main/",
  [
    "/main/folder",
    [
      "/main/folder/subFolder",
      [
        "/main/folder/subFolder/directory1",
        "/main/folder/subFolder/directory2",
        "/main/folder/subFolder/directory3"
      ]
    ],
    "/main/folder2",
    [
      "/main/folder2/subFolder",
      [
        "/main/folder2/subFolder/directory4",
        "/main/folder2/subFolder/directory5",
        "/main/folder2/subFolder/directory6",
        "/main/folder2/subFolder/directory7"
      ]
    ],
    "/main/folder3",
    [
      "/main/folder3/subFolder",
      [
        "/main/folder3/subFolder/directory4",
        "/main/folder3/subFolder/directory5",
        "/main/folder3/subFolder/directory6",
        "/main/folder3/subFolder/directory7"
      ],
      "/main/folder3/subs",
      [
        "/main/folder3/subFolderWrapper/folder1",
        [
          "/main/folder3/subs/folder1/subFolder",
          [
            "/main/folder3/subs/folder1/subFolder/directory1",
            "/main/folder3/subs/folder1/subFolder/directory2",
            "/main/folder3/subs/folder1/subFolder/directory3",
            "/main/folder3/subs/folder1/subFolder/directory4"
          ]
        ]
      ]
    ]
  ]
];

Я попробовал различные виды логики в этой функции ниже, но это была другая реализация дерева, которую я раньше не видел.Похоже, что некоторые виды обмана должны быть применены.Потому что есть два вида массивов, которые я знаю.Один из них плоский, также известный как одномерный, а другой - двумерный массив.

function traverse(item) {
  for(let index in item){

    if (Array.isArray(item[index])) {
        // logic for creating nested array
        traverse(item[index]);
     }
     else {
         // logic for non array strings
     }
  }
} 

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

Мне любопытно, как лучше всего добиться этого процесса.

1 Ответ

4 голосов
/ 02 мая 2019

Вы можете перебирать массивы и принимать не массивы в качестве пути и сохранять их для вложенных массивов.

function getArrays(array, path = '') {
    var temp;
    return array.map(v => Array.isArray(v)
        ? getArrays(v, temp)
        : (temp = path + (path && '/') + v)
    );
}

const directories = ["/main", ["folder", ["subFolder", ["directory1", "directory2", "directory3"]], "folder2", ["subFolder", ["directory4", "directory5"]], "folder3", ["subFolder", ["directory4", "directory5", "directory6", "directory7"], "subFolderWrapper", ["folder1", ["subFolder", ["child1", "child2", "child3", "child4"]]]]]];

console.log(getArrays(directories));
.as-console-wrapper { max-height: 100% !important; top: 0; }
...