降低Typescript / JS中嵌套对象数组的级别

时间:2019-10-27 07:13:55

标签: javascript typescript

我正在学习TypeScript和Angular,但遇到了问题。 说,我有一个Application对象数组。 每个Application对象都具有这种嵌套结构:

应用程序
|
---- [文件类型]
--------- |
-------------- [文档]
------------------ |
------------------------元数据

(每个Application都有一个Document Type数组。 每个Document Type都有一个Document数组。 每个Document内都有一个Metadata

示例:

[
 {
  "name": "Application 1",
  "parent_type": "root",
  "children": [
   {
    "name": "Operations Manual",
    "parent": "Application 1",
    "parent_type": "application",
    "count": 2,
    "children": [
     {
      "name": "App1-OpManual-1",
      "metadata": {
       "actualDocName": "operations1-app1",
       "currentStatus": "for review",
       "lastModifiedBy": "user 1",
       "size": 56,
       "fileExtension": "docx"
      }
     },
     {
      "name": "App1-OpManual-2",
      "metadata": {
       "actualDocName": "operations2-app1",
       "currentStatus": "for review",
       "lastModifiedBy": "user 2",
       "size": 56,
       "fileExtension": "pdf"
      }
     }
    ]
   }
  ]
 }
]

我正在尝试将此数组简化为这个数组(基本上是只保留嵌套直到第2级,然后丢弃其余的数组):

应用程序
|
---- [文档类型]

..以便JSON变为:

[
 {
  "name": "Application 1",
  "parent_type": "root",
  "children": [
   {
    "name": "Operations Manual",
    "parent": "Application 1",
    "parent_type": "application",
    "count": 2
   }
  ]
 }
] 

我一直在尝试教程中的多个示例,但还没有获得正确的JS来执行此操作。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

您可以使用.map()destructuring从数组中最外面的对象中获取所需的属性和值,然后再次使用.map()进行结构分解以获取属性您需要从最内层的对象将数组中的每个应用程序对象映射到自身的新创建的缩小版本:

const arr = [{name:"Application 1",parent_type:"root",children:[{name:"Operations Manual",parent:"Application 1",parent_type:"application",count:2,children:[{name:"App1-OpManual-1",metadata:{actualDocName:"operations1-app1",currentStatus:"for review",lastModifiedBy:"user 1",size:56,fileExtension:"docx"}},{name:"App1-OpManual-2",metadata:{actualDocName:"operations2-app1",currentStatus:"for review",lastModifiedBy:"user 2",size:56,fileExtension:"pdf"}}]}]}];

const res = arr.map(({children, ...r}) => (
    {
      ...r,
      children: children.map(({children, ...keep}) => ({...keep}))
    }
  ));

console.log(res);