Untitled

 avatar
unknown
javascript
4 years ago
2.1 kB
5
Indexable
var data = [
    {
        id: 'a',
        dependencyId: 'c',
        label: 'A'
    },
    {
        id: 'b',
        dependencyId: 'a',
        label: 'B'
    },
    {
        id: 'c',
        dependencyId: 'b',
        label: 'C'
    }
];

// Amen andam kara lini inch vor meki dependency-n kam inqy unena inch vor dependecy.
// Mi hat dependenciesCount em pahum. da kaxvacutyunner qanakn e (kara inqy unena kaxvacutyun kam iranic karan unenan kaxvacutyunner)


var isCyclic = (array) => {
    // nax mi hat senc object em sarqum.
    
    // {
    //     a: { id: 'a', dependencyId: 'c', label: 'A', dependenciesCount: 0 },
    //     b: { id: 'b', dependencyId: 'a', label: 'B', dependenciesCount: 0 },
    //     c: { id: 'c', dependencyId: 'b', label: 'C', dependenciesCount: 0 },
    // }

    var obj = {};

    for (var i = 0; i < array.length; i++) {
        var item = array[i];
        obj[item.id] = { ...item, dependenciesCount: 0 }
    }

    // hima verevum stacvac objecti vrayov frum em u ete inqy uni 
    // dependencyId, apa ira dependenciesCount-y +1 em anum. u gnum em ira dependencyId-ov
    // object-i dependenciesCount-y +1 em anem.

    for (key in obj) {
        var value = obj[key];
        if (value.dependencyId) {
            value.dependenciesCount++;
            obj[value.dependencyId].dependenciesCount++;
        }
    }

    // stanum em senc ban
    // {
    //     a: { id: 'a', dependencyId: 'c', label: 'A', dependenciesCount: 2 }, // because a-n kaxvac e c-ic, b-n el a-ic e kaxvac
    //     b: { id: 'b', dependencyId: 'a', label: 'B', dependenciesCount: 2 }, // because b-n kaxvac e a-ic, c-n el b-ic e kaxvac
    //     c: { id: 'c', dependencyId: 'b', label: 'C', dependenciesCount: 2 }, // because c-n kaxvac e b-ic, a-n el c-ic e kaxvac
    // }

    // u ete es objektneri bolori dependenciesCount-nery havasar en 2-i uremn cyclic a.
    var notCyclic = Object.values(obj).map(({ dependenciesCount }) => dependenciesCount).find(count => count !== 2);
    var cyclic = !notCyclic;

    return cyclic;
}

isCyclic(data);
Editor is loading...