У меня есть список элементов, у каждого есть идентификатор и родительский идентификатор.Я хочу определить, когда в этой «иерархии» есть цикл, и показать, какой идентификатор запускает цикл.
list = [
{
id: '1',
parent: '2'
},
{
id: '2',
parent: '3'
},
{
id: '3',
parent: '4'
},
{
//This id is causing the loop
id: '4',
parent: '1'
}
]
Я пытался построить дерево, которое работает, когда цикла нет., но не работает с циклом:
function treeify(list, idAttr, parentAttr, childrenAttr) {
if (!idAttr) idAttr = 'id';
if (!parentAttr) parentAttr = 'parent';
if (!childrenAttr) childrenAttr = 'children';
var treeList = [];
var lookup = {};
list.forEach(function(obj) {
lookup[obj[idAttr]] = obj;
obj[childrenAttr] = [];
});
list.forEach(function(obj) {
if (obj[parentAttr] != null) {
lookup[obj[parentAttr]][childrenAttr].push(obj);
} else {
treeList.push(obj);
}
});
return treeList;
};
Я также не могу определить, когда есть цикл.
Я хотел бы вернуть идентификатор элемента, который вызвал цикл кпозвольте мне исправить данные за ним.