检查数组中连接关系是否有往回连接?

问题描述

假如一个储存有连线数据的数组,例:1->2->3-4

let link = [
    {from:1,to:2},
    {from:2,to:3},
    {from:3,to:4},
];

需要判断检查数组中的数据是否有往回连接的情况,比如发生了1->2->3->1这种情况。捣鼓了半天我写的代码如下(不考虑两个点之间有重复连接和互相连接的情况下):

// 测试数据let link = [
    {from:3,to:4},
    {from:3,to:5},
    {from:2,to:4},
    {from:2,to:3},
    {from:1,to:2},
    {from:2,to:5}
];// 检查每一条线路是否有往回连接function checkLine(arr,data){    let _to = arr[arr.length-1];    for(let j=0;j<data.length;j++){        if(data[j].from === _to){            if(arr.indexOf(data[j].to)!==-1){
                flag = true;
            }else{
                arr.push(data[j].to);                let _data = data.filter(item=>(item.from!==data[j].from && item.to!==data[j].to));
                checkLine(arr,_data);                return;
            }
        }
    }
}// 标记是否有往回连接的情况let flag = false;// 开始for(let i=0;i<link.length;i++){    let arr = [];
    arr.push(link[i].from,link[i].to);    let _data = link.filter(item=>(item.from!==link[i].from && item.to!==link[i].to));
    checkLine(arr,_data);
}if(flag===true){    console.log("出错");
}

上面的代码简单的测试了下应该没问题,但是我自己看着都有点乱,有没有什么更好的方法或者JS的新特性可以更快的解决这个问题。


慕工程0101907
浏览 286回答 1
1回答

暮色呼如

转成有向图,然后遍历即可。有向图的遍历过程中自动就能检查回路的情况
打开App,查看更多内容
随时随地看视频慕课网APP