Как получить непосредственный родительский идентификатор дочернего идентификатора в массиве вложенных json объектов? - PullRequest
1 голос
/ 17 июня 2020

Мне нужно получить родительский идентификатор указанного c дочернего элемента.

Вот мой образец JSON. Если я даю идентификатор объекта 32, он должен вернуть 6 как родительский идентификатор, а если я дам 30 он должен вернуть 5 как родительский идентификатор.

const arr =  [{
    "id": 0,
    "name": "My Entity",
    "children": [
        {
            "id": 1,
            "name": "MARKET",
            "children": [
                {
                    "id": 2,
                    "name": "Sales",
                    "children": [
                        {
                            "id": 3,
                            "name": "District 1",
                            "children": [
                                {
                                    "id": 5,
                                    "name": "Area 1",
                                    "children": [
                                        {
                                            "entityId": 30,
                                            "id": 26,
                                            "name": "Mumbai"
                                        },
                                        {

                                            "entityId": 31,
                                            "id": 26,
                                            "name": "Hyderabad"
                                        }
                                    ],
                                    "num": 0,
                                },
                                {
                                    "id": 6,
                                    "name": "Area 2",
                                    "children": [
                                        {
                                            "entityId": 32,
                                            "id": 32,
                                            "name": "Karnataka"
                                        },
                                        {

                                            "entityId": 33,
                                            "id": 33,
                                            "name": "Andhra Pradesh"
                                        }
                                    ],
                                    "num": 0,
                                },
                            ]
                        },
                    ]
                },
            ]
        },
    ]
}]

Вот код, который я пробовал

const findParent = (arr, entityId) => {
    for (let i = 0; i < arr.length; i++) {
        if (arr[i].entityId === entityId) {
            return [];
        } else if (arr[i].children && arr[i].children.length) {
            const t = findParents(arr[i].children, entityId);

            if (t !== false) {
                t.push(arr[i].id);

                return t;
            }
        }
    }

    return false;
};

findParents(arr, 30);

Но он возвращается, как показано ниже

[
    5,
    3,
    2,
    1,
    0
]

Но я хотите, чтобы результат был

[
  5
]

Пожалуйста, помогите мне в этом, спасибо

Ответы [ 2 ]

2 голосов
/ 17 июня 2020

Замените это:

t.push(arr[i].id);

на:

if (t.length == 0) t.push(arr[i].id);
0 голосов
/ 17 июня 2020

Я бы предложил более простое решение

const findParent = (arr, entityId) => {
  const children = arr.flatMap(parent => 
    (item.children || []).map(child => ({ parent, child, entityId: child.entityId }))
  )

  const res = children.find(item => item.entityId === entityId)
  return res.entityId || findChildren(res.map(v => v.child), entityId)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...