我有一个多维数组,如下所示。
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: []
}
]
}
]
}
];
你可以通过实现递归搜索来实现。
我的代码段就是这样做的,并在以下数据中进行迭代 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'