Я пытаюсь напечатать все созданные группы, и они являются детьми, поэтому это будет выглядеть так:
[ [ 'Father1', 'Child1', 'Child2', 'Child3' ],
[ 'Father1', 'Child1', 'Child4' ],
[ 'Father1', 'Child1', 'Child5' ] ]
Проблемы, с которыми я столкнулся, различны.из: var keys = name.keys (o);^ TypeError: name.keys не является функцией для полного переполнения стека, я отлаживал функцию printPath и выполняет свою работу отдельно, но не с моей окончательной структурой дерева.
Мое дерево и функция печати выглядят так:
groups.js:
class groups {
constructor() {
this.root = new Group('root');
}
printPath(name){
this.root.getPath(name)
}
group.js:
class Group {
constructor(name, parent) {
this.name = name;
this.parent = parent || null;
this.children = [];
this.users = new users || null;
}
getPath(name) {
function iter(o, p) {
var keys = name.keys(o);
if (keys.length) {
return keys.forEach(function (k) {
iter(o[k], p.concat(k));
});
}
result.push(p);
}
var result = [];
iter(name, []);
return result;
}
Редактировать: Для создания группы я использую функцию обработчика меню:
function createGroup(callback) {
rl.question('Add name for father group: \n', (parent) => {
let parentGroup = programdata.groups.findGroupByName(parent);
if (!parentGroup) {
parentGroup = programdata.groups.root;
}
rl.question('name of new group\n', (groupName) => {
parentGroup.setChildren(new Group(groupName, parentGroup));
console.log(parentGroup);
callback();
});
})
}
findGroupByName - замечательная рекурсия, которую я сделал, которая находит вложенные группы (не стесняйтесь использовать!) сидя в группах классов.
findGroupByName(name) {
if (!name) return null;
return this._findGroupByNameInternal(this.root, name);
}
_findGroupByNameInternal(group, name) {
if (!group) return null;
if (group.name === name) return group;
for (const g of group.children) {
const result = this._findGroupByNameInternal(g, name);
if (!result) continue;
return result;
}
}
И функция setChildren помещена в группу классов:
setChildren(child) {
this.children.push(child);
}
РЕДАКТИРОВАТЬ: СпасибоВы за ответ, не могли бы вы помочь мне реализовать ваш метод в моем обработчике меню?Я попробовал это: и это ничего не дало мне.
function createGroup(callback) {
rl.question('Add name for father group: \n', (parent) => {
let parentGroup = programdata.groups.findGroupByName(parent);
let treePath = Group.root.printPath();
if (!parentGroup) {
parentGroup = programdata.groups.root;
}
rl.question('name of new group\n', (groupName) => {
parentGroup.addChild(new Group(groupName, parentGroup));
console.log(treePath);
callback();
});
})
}