【问题标题】:Javascript access deep child object by array of index numbers and assign new valueJavascript通过索引号数组访问深层子对象并分配新值
【发布时间】:2021-10-02 05:20:06
【问题描述】:
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,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,1,1,0]

有没有办法

预期结果

let folders = [
  {
    name: 'root',
    children:[
      {name:'folder1'},
      {
        name:'folder2',
        children:[
          {name: 'folder2.1'},
          {
            name: 'folder2.2',
            children: [
              {
                name:'target folder',
                children: [{name:'new1'},{name:'new2'}] // <--- this
              }
            ]
          },
          {name: 'folder2.3'},
        ]
      },
      {name:'folder3'}
    ]
  }
]

【问题讨论】:

标签: javascript arrays object javascript-objects


【解决方案1】:

您可以根据需要更改 attachFolderName 变量。

let folders = [
  {
    name: 'root',
    children:[
      {name:'folder1'},
      {
        name:'folder2',
        children:[
          {name: 'folder2.1'},
          {
            name: 'folder2.2',
            children: [
              {
                name:'target folder',
                children: [{name:'new1'},{name:'new2'}] // <--- this
              }
            ]
          },
          {name: 'folder2.3'},
        ]
      },
      {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)

【讨论】:

    【解决方案2】:

    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, 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);

    【讨论】:

    • 你节省了我的时间@Nitheesh。正是我想要的。非常感谢。
    • @Manojkumar 欢迎您。如果这符合您的要求,请批准答案。很高兴也能获得支持。
    【解决方案3】:

    您可以使用递归函数找到文件夹,然后对其进行修改。

    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'}
        ]
      }
    ]
    
    const child_index_map = [0,1,1,0];
    
    const getParentFolder = (folders, childMap, currentIndex) => {
      if(currentIndex === childMap.length - 1) return folders;
      if(Array.isArray(folders)) return getParentFolder(folders[childMap[currentIndex]], childMap, currentIndex+1);
      
      return getParentFolder(folders.children[childMap[currentIndex]], childMap, currentIndex+1);
    }
    
    const parentFolder = getParentFolder(folders, child_index_map, 0);
    parentFolder.children = newFolders;
    
    console.log(folders)

    【讨论】:

      猜你喜欢
      • 2016-05-18
      • 2023-04-08
      • 1970-01-01
      • 2016-05-16
      • 2020-12-15
      • 1970-01-01
      • 2022-01-06
      • 2020-07-19
      • 2019-01-11
      相关资源
      最近更新 更多