Вычислить каталог по полному пути к файлу в дереве каталогов JSON - PullRequest
2 голосов
/ 23 октября 2019
{
  "path": null,//should be calculated back as: "photos"
  "size": 600,
  "type": "directory",
  "children": [
    {
      "path": null,//it should be calculated as: "photos/summer"
      "size": 400,
      "type": "directory",
      "children": [
        {
          "path": null,//should be calculated as :"photos/summer/june"
          "size": 400,
          "type": "directory",
          "children": [
            {
              "path": "photos/summer/june/windsurf.jpg",
              "name": "windsurf.jpg",
              "size": 400,
              "type": "file",
              "extension": ".jpg"
            }
          ]
        }
      ]
    },
    {
      "path": null,//should be calculated as: "photos/winter"
      "size": 200,
      "type": "directory",
      "children": [
        {
          "path": null,// should be calculated as: "photos/winter/january"
          "size": 200,
          "type": "directory",
          "children": [
            {
              "path": "photos/winter/january/ski.png",
              "name": "ski.png",
              "size": 100,
              "type": "file",
              "extension": ".png"
            },
            {
              "path": "photos/winter/january/snowboard.jpg",
              "name": "snowboard.jpg",
              "size": 100,
              "type": "file",
              "extension": ".jpg"
            }
          ]
        }
      ]
    }
  ]
}

Существует JSON, который представляет структуру каталогов. Все свойства «file» в json имеют абсолютный путь, назначенный свойству «path». Но в каждом подкаталоге / каталогах отсутствует значение «путь». Каждым подкаталогам с path = null необходимо назначить путь на основе самого глубокого дочернего элемента (type = "file"), для которого определен абсолютный путь. (Ожидаемый результат комментируется как //, его следует вычислять как: )

Я пробовал итеративный подход, но проблема в том, что я должен пройти json от глубины до вершины (то есть, самые глубокие дети к родителю). Кто-нибудь может порекомендовать более чистый подход?

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Вы можете установить path, взяв свойство name и повторить children, если существует, и передать последний путь.

function setPath(object, path = '') {
    (object.children || []).forEach(o => {
        var temp = setPath(o);
        if (temp) object.path = temp.slice(0, temp.lastIndexOf('/'));
    });
    return object.path;
}

var data = { path: null, size: 600, type: "directory", children: [{ path: null, size: 400, type: "directory", children: [{ path: null, size: 400, type: "directory", children: [{ path: "photos/summer/june/windsurf.jpg", name: "windsurf.jpg", size: 400, type: "file", extension: ".jpg" }] }] }, { path: null, size: 200, type: "directory", children: [{ path: null, size: 200, type: "directory", children: [{ path: "photos/winter/january/ski.png", name: "ski.png", size: 100, type: "file", extension: ".png" }, { path: "photos/winter/january/snowboard.jpg", name: "snowboard.jpg", size: 100, type: "file", extension: ".jpg" }] }] }] };

setPath(data);

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 23 октября 2019

Вы можете попробовать это,

function setPath(obj,path){
    let currentPath=path+'/'+obj.name;
    obj.path=currentPath;
    if(obj.children && obj.children.length){
        obj.children.forEach(item=>this.setPath(item,currentPath))
    }
}

вызвать эту функцию с именем объекта и пути как '/' например setPath(obj,'/')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...