[英]Find cyclic dependency without using graph in Map of array
我有一個像下面這樣的對象:
var myMap = {
v1: ['v2', 'v4', 'v5'],
v2: ['x', 'v4', 'y'],
v3: ['v2', 'v4', 'v5'],
v4: ['e', 'v1', 'v5'],
v5: ['v2', 'v4', 'v3'],
};
我必須找到實體的地圖循環而不將其轉換為圖形。
像輸出一樣如下:
var myDep = {
v1: {isCyclic: true, cyclicDependents: ['v4']},
v2: {isCyclic: false, cyclicDependents: []},
v3: {isCyclic: true, cyclicDependents: ['v5']},
v4: {isCyclic: true, cyclicDependents: ['v1', 'v5']},
v5: {isCyclic: true, cyclicDependents: ['v4', 'v3']},
};
我試過以下:
var graph = { v1: ["v2", "v4", "v5"], v2: ["x", "v4", "y"], v3: ["v2", "v4", "v5"], v4: ["e", "v1", "v5"], v5: ["v2", "v4", "v3"] }; var myDep = { v1: { isCyclic: false, cyclicDependents: [] }, v2: { isCyclic: false, cyclicDependents: [] }, v3: { isCyclic: false, cyclicDependents: [] }, v4: { isCyclic: false, cyclicDependents: [] }, v5: { isCyclic: false, cyclicDependents: [] } }; myDep = Object.keys(graph).reduce((a, b) => { graph[b] && graph[b].forEach(d => { if (graph[d] && ~graph[d].indexOf(b)) { a[b].isCyclic = true; a[b].cyclicDependents.push(d); } }); return a; }, myDep); console.log(myDep);
有沒有其他方法可以使其更高效。 我認為使用try catch塊以itrative方式使用JSON.stringify可能也是一種方式。 但我不確定它會更多/更少表現。
您可以使用一個函數來檢查循環特性並存儲被訪問的節點以防止永遠循環。
結果是具有起始鍵的對象及其循環的節點。 想要的格式留給讀者練習。
function isCyclic(node, target, [...visited] = []) { if (node === target) return true; if (visited.includes(node) || !myMap[node]) return false; visited.push(node); return myMap[node].some(n => isCyclic(n, target, visited)); } var myMap = { v1: ['v2', 'v4', 'v5'], v2: ['x', 'v4', 'y'], v3: ['v2', 'v4', 'v5'], v4: ['e', 'v1', 'v5'], v5: ['v2', 'v4', 'v3'] }, result = {}; Object.entries(myMap).forEach(([k, v]) => result[k] = v.filter(n => isCyclic(n, k))); console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.