Как искать и pu sh новый массив в рекурсивный многомерный массив в javascript (древовидная структура)? - PullRequest
0 голосов
/ 08 мая 2020

У меня есть многомерный массив вроде следующего

data = [
    {
      name: "C Drive",
      subfolders: [
          {
            name: "User",
            subfolders: [
              { name: 'local_user',
              subfolders: [
              ]}
            ]
          }
        ]
    },
    {
      name: "D",
      subfolders: [
        {
          name: "Games",
          subfolders: [
              {
                name: "User Files",
                subfolders: []
              },
              {
                name: "Users",
                subfolders: []
              }
            ]
        }
  ]
}
];

Мне также предоставляется массив путей ['C Drive', 'User'].

Я хочу чтобы создать функцию, которая примет путь и добавит новый объект в «подпапки» пути предоставления, например

addChild (['C Drive', 'User'], {name: 'new_folder ', вложенные папки: []}) должны вернуть

[
    {
      name: "C Drive",
      subfolders: [
          {
            name: "User",
            subfolders: [
              { name: 'local_user',
              subfolders: [
              ]},
                 { name: 'new_folder',
              subfolders: [
              ]}

            ]
          }
        ]
    },
    {
      name: "D",
      subfolders: [
        {
          name: "Games",
          subfolders: [
              {
                name: "User Files",
                subfolders: []
              },
              {
                name: "Users",
                subfolders: []
              }
            ]
        }
  ]
}
];

1 Ответ

0 голосов
/ 26 мая 2020

Вы можете сделать это, реализовав рекурсивный поиск.

Мой фрагмент делает это и выполняет итерацию по заданному route.

data = [{
    name: "C Drive",
    subfolders: [{
      name: "User",
      subfolders: [{
        name: 'local_user',
        subfolders: []
      }]
    }]
  },
  {
    name: "D",
    subfolders: [{
      name: "Games",
      subfolders: [{
          name: "User Files",
          subfolders: []
        },
        {
          name: "Users",
          subfolders: []
        }
      ]
    }]
  }
];

function traverseTree(route, data) {
  const r = 0
  const findParentNode = (folder, r) => {
    if (r < route.length - 1) {
      const f = folder.find(e => e.name === route[r])
      r++
      return findParentNode(f.subfolders, r)
    } else {
      return folder.find(e => e.name === route[r])
    }
  }
  return findParentNode(data, r)
}

// I suggest to pass the data array in the function
const addChild = (route, newNode, data) => {
  // you should check for the existence of the subfolders array
  return traverseTree(route, data).subfolders.push(newNode)
}

const route1 = ['C Drive', 'User']
const route2 = ['D', 'Games', 'Users']

addChild(route1, {
  name: 'new_folder',
  subfolders: []
}, data)
console.log('first:', data) // after adding node to 'C Drive -> User'

addChild(route2, {
  name: 'new_folder2',
  subfolders: []
}, data)
console.log('second:', data) // after adding node to 'D -> Games -> Users'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...