如何在javascript中搜索并将新数组推送到递归多维数组中(树状结构)?

问题描述 投票:-1回答:1

我有一个多维数组,如下所示。

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', subfolders: []})应返回

[
    {
      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: []
              }
            ]
        }
  ]
}
];
javascript arrays json object
1个回答
0
投票

你可以通过实现递归搜索来实现。

我的代码段就是这样做的,并在以下数据中进行迭代 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'
© www.soinside.com 2019 - 2024. All rights reserved.