如何解决Javascript通过索引号数组访问深层子对象并分配新值
const newFolders = [{name:'new1'},{name:'new2'}]
let folders = [
{
name: 'root',children:[
{name:'folder1'},{
name:'folder2',children:[
{name: 'folder2.1'},{
name: 'folder2.2',children: [
{name:'target folder'}
]
},{name: 'folder2.3'},]
},{name:'folder3'}
]
}
]
// I don't want to use the below line to assign the newFolders variable to the target object
folders[0].children[1].children[1].children[0].children = newFolders;
// instead I have below
const child_index_map = [0,1,0]; // it should be any length for future access
// what I tried is (unsuccessful)
let temp = folders;
child_index_map.forEach((i,index)=>{
temp = temp[i].children;
if(index === child_index_map.length - 1){
temp = newFolders;
}
});
let folders = temp;
这是我的文件夹结构,它应该是任意数量的孩子。
我想访问 {name:'target folder'} 对象并将 newFolders
分配给该对象,但不是像 folders[0].children[1].children[1].children[0].children = newFolders;
这样的典型方式
而不是上面的,我有索引数组 const child_index_map = [0,0]
有没有办法
预期结果
let folders = [
{
name: 'root',children: [
{
name:'target folder',children: [{name:'new1'},{name:'new2'}] // <--- this
}
]
},{name:'folder3'}
]
}
]
解决方法
array.forEach
区域的代码存在一些问题。
const newFolders = [{ name: 'new1' },{ name: 'new2' }]
let folders = [
{
name: 'root',children: [
{ name: 'folder1' },{
name: 'folder2',children: [
{ name: 'folder2.1' },{
name: 'folder2.2',children: [
{ name: 'target folder' }
]
},{ name: 'folder2.3' },]
},{ name: 'folder3' }
]
}
]
// I don't want to use the below line to assign the newFolders variable to the target object
// folders[0].children[1].children[1].children[0].children = newFolders;
// instead I have below
const child_index_map = [0,1,0]; // it should be any length for future access
// what I tried is (unsuccessful) => Is successful now
let temp = folders;
child_index_map.forEach((i,index) => {
temp = temp[i];
if (index === child_index_map.length - 1) {
temp.children = newFolders;
}
if (temp.children) {
temp = temp.children;
}
});
// There is no need to update your floders variable.
// folders = temp;
console.log(folders);
您可以使用递归函数找到文件夹,然后对其进行修改。
const newFolders = [{name:'new1'},{name:'new2'}]
let folders = [
{
name: 'root',children:[
{name:'folder1'},{
name:'folder2',children:[
{name: 'folder2.1'},children: [
{name:'target folder'}
]
},{name: 'folder2.3'},{name:'folder3'}
]
}
]
const child_index_map = [0,0];
const getParentFolder = (folders,childMap,currentIndex) => {
if(currentIndex === childMap.length - 1) return folders;
if(Array.isArray(folders)) return getParentFolder(folders[childMap[currentIndex]],currentIndex+1);
return getParentFolder(folders.children[childMap[currentIndex]],currentIndex+1);
}
const parentFolder = getParentFolder(folders,child_index_map,0);
parentFolder.children = newFolders;
console.log(folders)
您可以根据需要更改 attachFolderName
变量。
let folders = [
{
name: 'root',children: [
{
name:'target folder',children: [{name:'new1'},{name:'new2'}] // <--- this
}
]
},{name:'folder3'}
]
}
]
let findAndAdd = (data,obj,search) => {
function recursiveSearch (child) {
if (child.children) {
let filtered = child.children.find((f) => {
return f.name === search
})
if (filtered) {
if (!filtered.children)
filtered.children = [obj]
else
filtered.children.push(obj)
return;
}
child.children.forEach((c) => {
recursiveSearch(c)
})
}
}
recursiveSearch(data[0])
}
let attachFolderName = "target folder"
findAndAdd(folders,{name: "new test with recursive"},attachFolderName)
console.log(folders)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。