Как мне l oop через вложенный массив и вставить id и parentId для каждого уровня? - PullRequest
0 голосов
/ 06 марта 2020

Как мне l oop через вложенный массив и вставить id и parentId для каждого уровня?

Это то, что у меня есть:

{
    "locations": [
        {
            "name": "Europe",
            "children": [
                {
                    "name": "Denmark",
                    "children": [
                        {
                            "name": "Copenhagen",
                            "population": [
                                {
                                    "people": "602481"
                                }
                            ]
                        }
                    ]
                },
                {
                    "name": "South Europe",
                    "children": [
                        {
                            "name": "Spain",
                            "children": [
                                {
                                    "name": "Madrid",
                                    "population": [
                                        {
                                            "people": "6550000"
                                        }
                                    ]
                                },
                                {
                                    "name": "Barcelona",
                                    "population": [
                                        {
                                            "people": "5515000"
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        },
        {
            "name": "Asia",
            "children": [
                {
                    "name": "East Asia",
                    "children": [
                        {
                            "name": "China",
                            "children": [
                                {
                                    "name": "Beijing",
                                    "population": [
                                        {
                                            "people": "21540000"
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}

Это то, что я хочу:

{
    "locations": [
        {
            "id": "AP1",
            "name": "Europe",
            "children": [
                {
                    "id": "AP1.1",
                    "parentId": "AP1",
                    "name": "Denmark",
                    "children": [
                        {
                            "id": "AN1",
                            "parentId": "AP1.1",
                            "name": "Copenhagen",
                            "population": [
                                {
                                    "people": "602481"
                                }
                            ]
                        }
                    ]
                },
                {
                    "id": "AP1.2",
                    "parentId": "AP1",
                    "name": "South Europe",
                    "children": [
                        {
                            "id": "AP1.2.1",
                            "parentId": "AP1.2",
                            "name": "Spain",
                            "children": [
                                {
                                    "id": "AN2",
                                    "parentId": "AP1.2.1",
                                    "name": "Madrid",
                                    "population": [
                                        {
                                            "people": "6550000"
                                        }
                                    ]
                                },
                                {
                                    "id": "AN3",
                                    "parentId": "AP1.2.1",
                                    "name": "Barcelona",
                                    "population": [
                                        {
                                            "people": "5515000"
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        },
        {
            "id": "AP2",
            "name": "Asia",
            "children": [
                {
                    "id": "AP2.1",
                    "parentId": "AP2",
                    "name": "East Asia",
                    "children": [
                        {
                            "id": "AP2.1.1",
                            "parentId": "AP2.1",
                            "name": "China",
                            "children": [
                                {
                                    "id": "AN4",
                                    "parentId": "AP2.1.1",
                                    "name": "Beijing",
                                    "population": [
                                        {
                                            "people": "21540000"
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}

Я относительно новичок в JavaScript, я только знаю, как l oop через первый массив, который является Европой и Азией, используя basi c для l oop. Как я могу на самом деле пройти через всю иерархию?

1 Ответ

1 голос
/ 06 марта 2020

Вы можете сделать что-то вроде этого:

const obj = {
  "locations": [{
      "name": "Europe",
      "children": [{
          "name": "Denmark",
          "children": [{
            "name": "Copenhagen",
            "population": [{
              "people": "602481"
            }]
          }]
        },
        {
          "name": "South Europe",
          "children": [{
            "name": "Spain",
            "children": [{
                "name": "Madrid",
                "population": [{
                  "people": "6550000"
                }]
              },
              {
                "name": "Barcelona",
                "population": [{
                  "people": "5515000"
                }]
              }
            ]
          }]
        }
      ]
    },
    {
      "name": "Asia",
      "children": [{
        "name": "East Asia",
        "children": [{
          "name": "China",
          "children": [{
            "name": "Beijing",
            "population": [{
              "people": "21540000"
            }]
          }]
        }]
      }]
    }
  ]
}

function recur(arr, prevId = undefined) {
  let countId = 0;

  arr.forEach(item => {
    countId++;
    
    if (prevId) {
      item.id = prevId + '.' + countId;
      item.parentId = prevId;
    } else {
      item.id = countId.toString();
    }

    if ('children' in item && item.children.length > 0) {
      recur(item.children, item.id);
    }
  });
}

recur(obj.locations);
document.getElementById('output').innerHTML = JSON.stringify(obj, undefined, 4);

И это неправда, что вам нужна рекурсия. Вы можете сделать это итеративно, если вы хотите узнать об этом, вы можете начать здесь: Обход дерева в Википедии .


РЕДАКТИРОВАТЬ: Просто заметил, что должна быть схема именования идентификаторов, но, поскольку вы не указали, что это такое, я не могу с этим поделать. По сути, вам нужно расширить эту функцию с помощью условных выражений, которые будут определять фактическую строку в id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...