topology sort, simplified, kinda
cycle check using custom algorithm
by Yurii Predborskyi
JavaScript
let employees = [
{ id: 0, name: 'base', boss: null },
{ id: 1, name: 'boss2', boss: 0 },
{ id: 2, name: 'bossy', boss: 0 },
{ id: 3, name: 'cool', boss: 2 }
];
let result = setBoss(employees[0], 1);
console.log('expected: fail, result:', result);
result = setBoss(employees[1], null);
console.log('expected: success, result:', result);
function setBoss(item, bossId) {
let temp = item.boss;
item.boss = bossId;
if (hasCycle(item)) {
item.boss = temp;
return 'fail';
} else {
return 'success';
}
}
function hasCycle(item) {
console.log('adding', item);
let bosses = { [item.id]: true };
let boss = item;
while (boss.boss !== null && boss.boss !== undefined) {
console.log('bosses', bosses);
console.log('boss', boss);
boss = employees.find((el) => boss.boss === el.id);
if (!bosses[boss.id]) {
bosses[boss.id] = true;
} else {
return true;
}
}
return false;
}