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;
}