根据条件递归地从父项中删除子项

问题描述 投票:0回答:1

我有一个看起来像这样的数据:

{
  "fileObjects": [
    {
      "type": "DIRECTORY",
      "name": "st",
      "fileObjects": [
        {
          "type": "DIRECTORY",
          "name": "ko",
          "fileObjects": [
            {
              "type": "DIRECTORY",
              "name": "ve",
              "fileObjects": []
            }
          ]
        }
      ]
    },
    {
      "type": "FILE",
      "name": "ac"
    },
    {
      "type": "DIRECTORY",
      "name": "rf",
      "fileObjects": [
        {
          "type": "DIRECTORY",
          "name": "lo",
          "fileObjects": [
            {
              "type": "FILE",
              "name": "we",
            }
          ]
        }
      ]
    }
  ]
}

我想递归地过滤空目录,简单地摆脱它们:

{
  "fileObjects": [
    {
      "type": "FILE",
      "name": "ac"
    },
    {
      "type": "DIRECTORY",
      "name": "rf",
      "fileObjects": [
        {
          "type": "DIRECTORY",
          "name": "lo",
          "fileObjects": [
            {
              "type": "FILE",
              "name": "we",
            }
          ]
        }
      ]
    }
  ]
}

我的尝试:

function mapFileObject(fileObject) {
  if (fileObject.type === "FILE") {
    return fileObject;
  }

  return {
    ...fileObject,
    fileObjects: fileObject.fileObjects
      .filter((fileObjectChild) => {
        return fileObjectChild.fileObjects.length > 0;
      })
      .map((fileObjectChild) => mapFileObject(fileObjectChild)),
  };
}

const newFileObjects = {
  fileObjects: input.fileObjects.map((fileObjectChild) =>
    mapFileObject(fileObjectChild)
  ),
};

不幸的是,这不起作用

javascript loops recursion mapping
1个回答
0
投票
  1. filter
    map
    函数调用的顺序很重要,您应该在使用递归调用调用
    map
    后使用过滤器。
      .map((fileObjectChild) => mapFileObject(fileObjectChild)),
      .filter((fileObjectChild) => {
        return fileObjectChild.fileObjects.length > 0;
      })
  1. 之后,您应该对数据结构的根级别应用相同的过滤
© www.soinside.com 2019 - 2024. All rights reserved.