Доступ к части объекта с использованием пути - PullRequest
0 голосов
/ 07 января 2019

Имейте объект, как показано ниже:

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', 

Смогу ли я получить доступ к дочерней части объекта внутри FolderB с помощью массива Reduce? Попробовал это с ошибкой:

var res = path.split('/').reduce(function(o, k) {
 return o && o[k];
}, arrObj);

1 Ответ

0 голосов
/ 07 января 2019

Использование Массив # уменьшить и Массив # найти

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"));
...