代码之家  ›  专栏  ›  技术社区  ›  Uzair Khan

使用路径访问对象的一部分

  •  1
  • Uzair Khan  · 技术社区  · 6 年前

    具有如下所示的对象:

    const arrObj = [
    {
       name: 'FolderA',
       path: '/',
       child: [
         {
           name: 'FolderB',
           path: '/FolderA',
           child: [
             {
               name: 'FolderC0',
               path: '/FolderA/FolderB',
               child: [],
             },
             {
               name: 'FolderC1',
               path: '/FolderA/FolderB',
               child: [],
             },
           ],
         },
       ],
     },
     {
       name: 'FolderM',
       path: '/',
       child: [],
     },
    ];
    

    如果路径是字符串:

    var path = '/FolderA/FolderB', 
    

    我能用array reduce访问folderb中对象的子部分吗? 尝试失败:

    var res = path.split('/').reduce(function(o, k) {
     return o && o[k];
    }, arrObj);
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   kockburn    6 年前

    使用 Array#reduce Array#find

    const path = '/FolderA/FolderB'
    const data =[{name:'FolderA',path:'/',child:[{name:'FolderB',path:'/FolderA',child:[{name:'FolderC0',path:'/FolderA/FolderB',child:[],},{name:'FolderC1',path:'/FolderA/FolderB',child:[],},],},],},{name:'FolderM',path:'/',child:[],},]
    
    const res = path.slice(1).split("/").reduce((a,c)=>{
      return a.find(({name})=> name === c).child;
     }, data);
    
    console.log(res);

    测验:

    const data=[{name:'FolderA',path:'/',child:[{name:'FolderB',path:'/FolderA',child:[{name:'FolderC0',path:'/FolderA/FolderB',child:[],},{name:'FolderC1',path:'/FolderA/FolderB',child:[{name:'FolderD0',path:'/FolderA/FolderB/FolderC1',child:[]}],},],},],},{name:'FolderM',path:'/',child:[],},]
    
    function find(path){return path.slice(1).split("/").reduce((a,c)=>a.find(({name})=>name===c).child,data)}
    
    
    console.log(find("/FolderA"));
    console.log(find("/FolderA/FolderB"));
    //no children so should be empty
    console.log(find("/FolderA/FolderB/FolderC0"));
    //Not empty
    console.log(find("/FolderA/FolderB/FolderC1"));