Как удалить свойства рекурсивлей из объекта на основе ключа / значения - PullRequest
1 голос
/ 17 октября 2019

Я пытаюсь удалить некоторых дочерних объектов объекта, основываясь на том, имеет ли их ключ «size» значение 0.
Я использую пакет npm directory-tree , чтобы получитьобъект javascript, представляющий выбранный каталог.

Объект выглядит примерно так:

{
  "path": "directory",
  "name": "directory",
  "children": [
    {
      "path": "directory\\file1.html",
      "name": "file1.html",
      "size": 147,
      "extension": ".html",
      "type": "file"
    },
    {
      "path": "directory\\file2.htm",
      "name": "file2.htm",
      "size": 147,
      "extension": ".htm",
      "type": "file"
    },
    {
      "path": "directory\\file3.php",
      "name": "file3.php",
      "size": 147,
      "extension": ".php",
      "type": "file"
    },
    {
      "path": "directory\\subdirectory-1",
      "name": "subdirectory-1",
      "children": [],
      "size": 0,
      "type": "directory"
    },
    {
      "path": "directory\\subdirectory-2",
      "name": "subdirectory-2",
      "children": [
        {
          "path": "directory\\subdirectory-2\\subfile1.html",
          "name": "subfile1.html",
          "size": 147,
          "extension": ".html",
          "type": "file"
        },
        {
          "path": "directory\\subdirectory-2\\subfile2.htm",
          "name": "subfile2.htm",
          "size": 147,
          "extension": ".htm",
          "type": "file"
        }
      ],
      "size": 294,
      "type": "directory"
    },
    {
      "path": "directory\\subdirectory-3",
      "name": "subdirectory-3",
      "children": [
        {
          "path": "directory\\subdirectory-3\\sub-subdirectory",
          "name": "sub-subdirectory",
          "children": [],
          "size": 0,
          "type": "directory"
        },
        {
          "path": "directory\\subdirectory-3\\subfile3.php",
          "name": "subfile3.php",
          "size": 147,
          "extension": ".php",
          "type": "file"
        },
        {
          "path": "directory\\subdirectory-3\\subfile4.html",
          "name": "subfile4.html",
          "size": 147,
          "extension": ".html",
          "type": "file"
        }
      ],
      "size": 294,
      "type": "directory"
    }
  ],
  "size": 1029,
  "type": "directory"
}

Теперь я пытаюсь удалить каждый каталог с размером 0 рекурсивлей.

Я пытался перебирать дочерние объекты, используя функцию самостоятельного вызова:

function filterObject(obj){
  for(i=0; i<obj.children.length; i++){
    if(obj.children[i].type == "directory"){
      if(obj.children[i].size == 0){
        delete obj.children[i]
      }
      else {
        filterObject(obj.children[i])
      }
    }
  }
}

Но я получаю сообщение об ошибке:

renderer.js: 22 Uncaught TypeError: Невозможно прочитать свойство 'type' из неопределенного

Когда я изменяю код, чтобы каждый дочерний элемент был проверен, если это сам объект

if(typeof obj.children[i] === 'object' && obj.children[i].type == "directory"){...}

У меня проблема с циклом, и браузер зависает (нужно перезагрузить).

1 Ответ

0 голосов
/ 17 октября 2019

Вы можете отфильтровать элементы и изменить объект для вложенных детей.

function removeZero(o) {            
    if (o.size === 0) return false;
    if (o.children) o.children = o.children.filter(removeZero);
    return true;
}

var data = { path: "directory", name: "directory", children: [{ path: "directory\file1.html", name: "file1.html", size: 147, extension: ".html", type: "file" }, { path: "directory\file2.htm", name: "file2.htm", size: 147, extension: ".htm", type: "file" }, { path: "directory\file3.php", name: "file3.php", size: 147, extension: ".php", type: "file" }, { path: "directory\\subdirectory-1", name: "subdirectory-1", children: [], size: 0, type: "directory" }, { path: "directory\\subdirectory-2", name: "subdirectory-2", children: [{ path: "directory\\subdirectory-2\\subfile1.html", name: "subfile1.html", size: 147, extension: ".html", type: "file" }, { path: "directory\\subdirectory-2\\subfile2.htm", name: "subfile2.htm", size: 147, extension: ".htm", type: "file" }], size: 294, type: "directory" }, { path: "directory\\subdirectory-3", name: "subdirectory-3", children: [{ path: "directory\\subdirectory-3\\sub-subdirectory", name: "sub-subdirectory", children: [], size: 0, type: "directory" }, { path: "directory\\subdirectory-3\\subfile3.php", name: "subfile3.php", size: 147, extension: ".php", type: "file" }, { path: "directory\\subdirectory-3\\subfile4.html", name: "subfile4.html", size: 147, extension: ".html", type: "file" }], size: 294, type: "directory" }], size: 1029, type: "directory" };

data.children = data.children.filter(removeZero);

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...