Получить родительский объект из ключа или его значения во вложенном объекте - PullRequest
0 голосов
/ 02 августа 2020

У меня есть объект, который содержит всю информацию о папках и файлах каталога в иерархическом порядке. например

{
  "path": "./parent",
  "name": "parent",
  "type": "folder",
  "children": [
    {
      "path": "./parent/child1",
      "name": "child1",
      "type": "folder",
      "children": [
        {
          "path": "./parent/child1/file1",
          "name": "file1",
          "size": 651956838,
          "extension": ".pdf",
          "type": "file"
        },
        {
          "path": "./parent/child1/file2",
          "name": "file2",
          "size": 468327031,
          "extension": ".pdf",
          "type": "file"
        }
      ]
    },
    {
      "path": "./parent/child2",
      "name": "child2",
      "type": "folder",
      "children": [
        {
          "path": "./parent/child2/file3",
          "name": "file1",
          "size": 651956838,
          "extension": ".pdf",
          "type": "file"
        },
        {
          "path": "./parent/child2/file4",
          "name": "file2",
          "size": 468327031,
          "extension": ".pdf",
          "type": "file"
        }
      ]
    }
  ]
}
Теперь у меня будет значение пути, и из этой информации я хочу получить доступ к свойству children, которое является родственником ключа, для которого этот путь был значением. Скажем, у меня есть путь "./parent/child1", тогда я хочу иметь значение свойства children относительно этого пути, которое будет
  [
    {
      "path": "./parent/child1/file1",
      "name": "file1",
      "size": 651956838,
      "extension": ".pdf",
      "type": "file"
    },
    {
      "path": "./parent/child1/file2",
      "name": "file2",
      "size": 468327031,
      "extension": ".pdf",
      "type": "file"
    }
  ]

Итак, я хочу знать, возможно это или нет. Если да, то как, а если нет, то есть ли другой способ добиться аналогичного результата?

Ответы [ 2 ]

1 голос
/ 02 августа 2020

А вот другой подход, без рекурсии:

const data={
  "path": "./parent",
  "name": "parent",
  "type": "folder",
  "children": [
{
  "path": "./parent/child1",
  "name": "child1",
  "type": "folder",
  "children": [
    {
      "path": "./parent/child1/file1",
      "name": "file1",
      "size": 651956838,
      "extension": ".pdf",
      "type": "file"
    },
    {
      "path": "./parent/child1/file2",
      "name": "file2",
      "size": 468327031,
      "extension": ".pdf",
      "type": "file"
    }
  ]
},
{
  "path": "./parent/child2",
  "name": "child2",
  "type": "folder",
  "children": [
    {
      "path": "./parent/child2/file3",
      "name": "file1",
      "size": 651956838,
      "extension": ".pdf",
      "type": "file"
    },
    {
      "path": "./parent/child2/file4",
      "name": "file2",
      "size": 468327031,
      "extension": ".pdf",
      "type": "file"
    }
  ]
}
  ]
};

function getChildrenOf(fs,pth){
  let ptha=pth.split('/');
  ptha.forEach((d,i,a)=>a[i]=(i?a[i-1]+'/':'')+d);
  // console.log(ptha);
  return ptha.filter(d=>d!==".").reduce((a,c)=>
a=a.find(d=>d.path===c && d.type==="folder").children
  ,[fs]);
}

console.log(getChildrenOf(data,"./parent/child1"));

Поскольку массив data не содержит никакой информации о текущем каталоге (./), я удаляю этот элемент из массива ptha. В противном случае поиск будет разрешать поиск в произвольной глубине файловых структур.

1 голос
/ 02 августа 2020

Это можно сделать с помощью рекурсивной функции.


const paths = {
  "path": "./parent",
  "name": "parent",
  "type": "folder",
  "children": [
    {
      "path": "./parent/child1",
      "name": "child1",
      "type": "folder",
      "children": [
        {
          "path": "./parent/child1/file1",
          "name": "file1",
          "size": 651956838,
          "extension": ".pdf",
          "type": "file"
        },
        {
          "path": "./parent/child1/file2",
          "name": "file2",
          "size": 468327031,
          "extension": ".pdf",
          "type": "file"
        }
      ]
    },
    {
      "path": "./parent/child2",
      "name": "child2",
      "type": "folder",
      "children": [
        {
          "path": "./parent/child2/file3",
          "name": "file1",
          "size": 651956838,
          "extension": ".pdf",
          "type": "file"
        },
        {
          "path": "./parent/child2/file4",
          "name": "file2",
          "size": 468327031,
          "extension": ".pdf",
          "type": "file"
        }
      ]
    }
  ]
}

const pathtofind = "./parent/child1";

function findChildrenInPath(object, path) {
    if (path.startsWith(object.path)) {
        if (object.path == path) {
            return object.children;
        }
        else {
            for (let child of object.children) {
                const result = findChildrenInPath(child, path);
                if (result) {
                    return result;
                }
            }
        }
    }
}

const res = findChildrenInPath(paths, pathtofind);
console.log(res);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...