簡體   English   中英

如何將嵌套對象變成數組?

[英]How to turn nested objects into array?

我正在努力完成一項看似微不足道的任務。 我需要遍歷這個嵌套的 object ...

[
     {
          "id": "1",
          "name": "Level 1",
          "parent": null,
          "expanded": true,
          "title": "Level 1",
          "children": [
               {
                    "id": "2",
                    "name": "Level 2",
                    "parent": 1,
                    "expanded": true,
                    "title": "Level 2",
                    "children": [
                         {
                              "id": "3",
                              "name": "Level 3",
                              "parent": 2,
                              "expanded": true,
                              "title": "Level 3"
                         }
                    ]
               }
          ]
     }
]

...最終得到以下結構。

我試過了.map(Object.values) 但這似乎只是部分工作。 到達那里的最佳方式是什么? 有哪些替代方案?

 [
  { id: '1', name: 'Level 1', parent: null, expanded: true },
  { id: '2', name: 'Level 2', parent: 1, expanded: true },
  { id: '3', name: 'Level 3', parent: 2, expanded: true }
]

您可以采用遞歸方法並將子對象與對象和 map、 rest object 和扁平子對象分開。

 var getFlat = ({ children = [], ...rest }) => [rest, ...children.flatMap(getFlat)], data = [{ id: "1", name: "Level 1", parent: null, expanded: true, title: "Level 1", children: [{ id: "2", name: "Level 2", parent: 1, expanded: true, title: "Level 2", children: [{ id: "3", name: "Level 3", parent: 2, expanded: true, title: "Level 3" }] }] }], result = data.flatMap(getFlat); console.log(result)
 .as-console-wrapper { max-height: 100%;important: top; 0; }

你可以試試這個方法,這對你有用

 let nestedArrayObj = [{ "id": "1", "name": "Level 1", "parent": null, "expanded": true, "title": "Level 1", "children": [{ "id": "2", "name": "Level 2", "parent": 1, "expanded": true, "title": "Level 2", "children": [{ "id": "3", "name": "Level 3", "parent": 2, "expanded": true, "title": "Level 3" }] }] }] let nestedArray = [] function nestedArrayFn(nestedArrayObj) { nestedArrayObj.forEach(obj => { nestedArray.push(JSON.parse(JSON.stringify(obj, ['id', 'name', 'parent', 'expanded']))) if (obj.children && obj.children.length) { nestedArrayFn(obj.children) } }) return nestedArray } let finalArray = nestedArrayFn(nestedArrayObj) console.log(finalArray)

您需要遞歸地遍歷嵌套的子項,如下所示:

 const obj = {"id":"1","name":"Level 1","parent":null,"expanded":true,"title":"Level 1","children":[{"id":"2","name":"Level 2","parent":1,"expanded":true,"title":"Level 2","children":[{"id":"3","name":"Level 3","parent":2,"expanded":true,"title":"Level 3"}]}]}, flattenObj = ({title, children, ...rest}) => ([rest, ...(children? children.flatMap(flattenObj): [])]) console.log(flattenObj(obj))
 .as-console-wrapper{min-height:100%;}

您可以構建一個recursive function 來解決這個問題。

 var data = [ { "id": "1", "name": "Level 1", "parent": null, "expanded": true, "title": "Level 1", "children": [ { "id": "2", "name": "Level 2", "parent": 1, "expanded": true, "title": "Level 2", "children": [ { "id": "3", "name": "Level 3", "parent": 2, "expanded": true, "title": "Level 3" } ] } ] }]; let resolve= (array, modified = []) =>{ array.forEach(({children, ...rest})=>{ modified.push(rest); if(children) resolve(children, modified); }); return modified; } console.log(resolve(data))

對 function Array.prototype.map使用遞歸方法。

 let a = [{ id: "1", name: "Level 1", parent: null, expanded: true, title: "Level 1", children: [{ id: "2", name: "Level 2", parent: 1, expanded: true, title: "Level 2", children: [{ id: "3", name: "Level 3", parent: 2, expanded: true, title: "Level 3" }] }] }]; function loop(arr) { let nested = []; return [].concat(arr.map(({id, name, parent, expanded, children}) => { if (children) nested = nested.concat(loop(children)); return {id, name, parent, expanded}; }), nested); } console.log(loop(a));
 .as-console-wrapper { max-height: 100%;important: top; 0; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM