我撰寫了一個遞回函式來查找給定物件和該樹中的路徑,但是當我將目標 id(在這里:if(tree.targetModuleId === 7))更改為 10 時出現錯誤:
“訊息”:“未捕獲的型別錯誤:無法讀取未定義的屬性(讀取 'unshift')”
我應該得到路徑:[1,2,5,6,10]。
最后,我需要一個選項,即無論我想獲得什么點到點的路線,我都需要得到答案是什么路線,如果沒有,那么得到 []
我很想獲得有關該主題的幫助,并附上我制作的代碼。
let nodes = [
{ sourceModuleId: 1, targetModuleId: 2},
{ sourceModuleId: 1, targetModuleId: 8},
{ sourceModuleId: 2, targetModuleId: 3},
{ sourceModuleId: 2, targetModuleId: 5},
{ sourceModuleId: 8, targetModuleId: 9},
{ sourceModuleId: 3, targetModuleId: 7},
{ sourceModuleId: 5, targetModuleId: 6},
{ sourceModuleId: 6, targetModuleId: 10},
];
function toTree(arr) {
let arrMap = new Map(arr.map(item => [item.targetModuleId, item]));
let tree = [];
for (let i = 0; i < arr.length; i ) {
let item = arr[i];
if (item.sourceModuleId !==1) {
let parentItem = arrMap.get(item.sourceModuleId);
if (parentItem) {
let { children } = parentItem;
if (children) {
parentItem.children.push(item);
} else {
parentItem.children = [item];
}
}
} else {
tree.push(item);
}
}
return tree;
}
function findInTree(tree) {
if (tree.targetModuleId === 7) {
let path = [tree.sourceModuleId,tree.targetModuleId];
return {result: tree, path};
}
if(tree.children){
for(let i=0; i< tree.children.length;i ){
let tmp = findInTree(tree.children);
if (tmp) {
tmp.path.unshift(tree.sourceModuleId);
return tmp;
}
}
}
else {
for (let i = 0;i< tree.length; i ) {
let tmp = findInTree(tree[i]);
if (tmp) {
return tmp;
}
}
return [];
}
}
let tree = toTree(nodes);
let paths = findInTree(tree);
console.log(paths);
uj5u.com熱心網友回復:
中的一些問題findInTree:
return []不正確:這是一個真實的值,所以呼叫者的if (tmp)意志是真實的,它不應該是真實的。您的函式回傳的資料型別應該是一致的。看起來它應該是一個具有result和path屬性的物件,但是return []在你的代碼中有一個是不一致的。做那個return null,以表明沒有這樣的物件,并且考慮到呼叫者的預期行為,這個值將是虛假的。將其return null移出else塊,因此它也適用于if塊不執行return.在該
if (tree.children)塊中,沒有必要遍歷這些孩子,因為這將在遞回呼叫中發生。請注意您從未i在該回圈中使用,因此重復該主體是浪費時間。只需洗掉回圈。
function findInTree(tree) {
if (tree.targetModuleId === 7) {
let path = [tree.sourceModuleId, tree.targetModuleId];
return {result: tree, path};
}
if (tree.children) {
// No need to loop. It will happen in the recursive call
let tmp = findInTree(tree.children);
if (tmp) {
tmp.path.unshift(tree.sourceModuleId);
return tmp;
}
}
else {
for (let i = 0;i< tree.length; i ) {
let tmp = findInTree(tree[i]);
if (tmp) {
return tmp;
}
}
}
return null; // data type consistency
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/475123.html
標籤:javascript 反应 打字稿 算法 递归
