简体   繁体   English

如何遍历嵌套数组?

[英]How do I loop through nested arrays?

I have this structure below, and I want to loop through the hierarchy without missing any object.我在下面有这个结构,我想在不丢失任何对象的情况下遍历层次结构。

{
  "countries": [
    {
      "name": "Denmark",
      "id": "APA1",
      "children": [
        {
          "name": "Zealand",
          "id": "APA1.1",
          "parentId": "APA1",
          "children": [
            {
              "name": "Copenhagen",
              "id": "APA1.1.1",
              "parentId": "APA1.1",
              "children": [
                {
                  "name": "Dublin",
                  "id": "ANA1",
                  "parentId": "APA1.1.1.1",
                  "hostNames": [
                    {
                      "ip": "20.190.129.1"
                    },
                    {
                      "ip": "20.190.129.2"
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "name": "Jutland",
          "id": "APA1.2",
          "parentId": "APA1",
          "children": [
            {
              "name": "Nordjylland",
              "id": "APA1.2.1",
              "parentId": "APA1.2",
              "children": [
                {
                  "name": "Aalborg",
                  "id": "APA1.2.1.1",
                  "parentId": "APA1.2.1",
                  "children": [
                    {
                      "name": "Risskov",
                      "id": "ANA3",
                      "parentId": "APA1.2.1.1",
                      "hostNames": [
                        {
                          "ip": "40.101.81.146"
                        }
                      ]
                    },
                    {
                      "name": "Brabrand",
                      "id": "ANA4",
                      "parentId": "APA1.2.1.1",
                      "hostNames": [
                        {
                          "ip": "43.203.94.182"
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

The reason why I want to loop through the hierarchy is that I want to turn this into a flat structure.我想遍历层次结构的原因是我想把它变成一个平面结构。 So essentially I'm gonna take every object and move it to another array which has the structure that I want.所以基本上我要把每个对象移动到另一个具有我想要的结构的数组中。 I just want to know how to access the children.我只想知道如何访问孩子。

The wanted result:想要的结果:

"applicationGroups": [
    {
        "id" : "APA1",
        "name": "Denmark",
    },
    {
        "name": "Zealand",
        "id": "APA1.1",
        "parentId": "APA1"
    },
    {
        "name": "Copenhagen",
        "id": "APA1.1.1",
        "parentId": "APA1.1"
    },
    {
        "name": "Dublin",
        "id": "ANA1",
        "parentId": "APA1.1.1.1"
    },
    {
        "name": "Jutland",
        "id": "APA1.2",
        "parentId": "APA1"
    },
    {
        "name": "Nordjylland",
        "id": "APA1.2.1",
        "parentId": "APA1.2"
    },
    {
        "name": "Aalborg",
        "id": "APA1.2.1.1",
        "parentId": "APA1.2.1"
    },
    {
        "name": "Risskov",
        "id": "ANA3",
        "parentId": "APA1.2.1.1"
    },
    {
        "name": "Brabrand",
        "id": "ANA4",
        "parentId": "APA1.2.1.1"
    }
]

I'm a bit new to JavaScript, and I don't really know where to start, but this example that I have given is not identical to the actual one that I'm working on, so I just want the principle so I can implement it myself in my actual code.我对 JavaScript 有点陌生,我真的不知道从哪里开始,但是我给出的这个例子与我正在研究的实际例子不同,所以我只想要原理,这样我就可以在我的实际代码中自己实现它。

You can combine the Array.flat() method and this answer to flatten objects recursively.您可以结合使用Array.flat()方法和这个答案来递归地展平对象。 Using recursive functions is the faster way to accomplish that.使用递归函数是实现这一目标的更快方法。

To get a flat structure you could use reduce method to create recursive function.要获得扁平结构,您可以使用reduce方法来创建递归函数。

 const data = {"countries":[{"name":"Denmark","id":"APA1","children":[{"name":"Zealand","id":"APA1.1","parentId":"APA1","children":[{"name":"Copenhagen","id":"APA1.1.1","parentId":"APA1.1","children":[{"name":"Dublin","id":"ANA1","parentId":"APA1.1.1.1","hostNames":[{"ip":"20.190.129.1"},{"ip":"20.190.129.2"}]}]}]},{"name":"Jutland","id":"APA1.2","parentId":"APA1","children":[{"name":"Nordjylland","id":"APA1.2.1","parentId":"APA1.2","children":[{"name":"Aalborg","id":"APA1.2.1.1","parentId":"APA1.2.1","children":[{"name":"Risskov","id":"ANA3","parentId":"APA1.2.1.1","hostNames":[{"ip":"40.101.81.146"}]},{"name":"Brabrand","id":"ANA4","parentId":"APA1.2.1.1","hostNames":[{"ip":"43.203.94.182"}]}]}]}]}]}]} function flat(data) { return data.reduce((r, { children, ...rest }) => { if (children) r.push(...flat(children)) r.push(rest) return r; }, []) } const result = flat(data.countries) console.log(result)

You could take a flatMap approach for the recursive call of a flattening callback.您可以采用flatMap方法进行展平回调的递归调用。

 const flat = ({ hostNames, children = [], ...o }) => [o, ...children.flatMap(flat)], data = { countries: [{ name: "Denmark", id: "APA1", children: [{ name: "Zealand", id: "APA1.1", parentId: "APA1", children: [{ name: "Copenhagen", id: "APA1.1.1", parentId: "APA1.1", children: [{ name: "Dublin", id: "ANA1", parentId: "APA1.1.1.1", hostNames: [{ ip: "20.190.129.1" }, { ip: "20.190.129.2" }] }] }] }, { name: "Jutland", id: "APA1.2", parentId: "APA1", children: [{ name: "Nordjylland", id: "APA1.2.1", parentId: "APA1.2", children: [{ name: "Aalborg", id: "APA1.2.1.1", parentId: "APA1.2.1", children: [{ name: "Risskov", id: "ANA3", parentId: "APA1.2.1.1", hostNames: [{ ip: "40.101.81.146" }] }, { name: "Brabrand", id: "ANA4", parentId: "APA1.2.1.1", hostNames: [{ ip: "43.203.94.182" }] }] }] }] }] }] }, result = data.countries.flatMap(flat); console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM