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)