為什么我的遞回回傳未定義?我試圖從mongo中 "解碼 "嵌套的兒童資料,這些資料以ID的形式回傳,例如:
我的遞回為什么會回傳未定義?
{
"_id"。"613fd030f374cb62f8f91557",
"children": [
"613fd035f374cb62f8f9155b",
"613fd136f374cb62f8f91564",
"613fd1a5f374cb62f8f91571",
"613fd20bf374cb62f8f9157c"
],
...更多資料
}
我的目標是向下鉆取并將每個子ID轉換為該ID所代表的物件,并將其子ID轉換為物件,然后繼續下去,直到child ===[](無子)。我試圖讓最初的父物件(613fd030f374cb62f8f91557)能夠訪問所有多層嵌套的子物件。
這是我的代碼:
const get_documents=(documents)=> {
//回圈瀏覽每個檔案。
documents.map((span class="hljs-variable language_">document>) => {
if (document.parent ==null) {
//將孩子的id(_id)轉換為物件的陣列。
let dbData = [];
document.children.map((id) => {
let dbChildren = documents.find((x) => x._id == id) 。
dbData.push(dbChildren)。
});
let formattedData = [];
dbData.map((child) =>/span> {
let formattedObject = {
id: child._id,
name: child.name,
depth: 0,
parent: child.parent,
closed: true,
children: child_recursion(child.children)。
};
formattedData.push(formattedObject)
});
}
});
};
const child_recursion=(arr)=> {
let dbData = [] 。
arr.map((id) =>; {
let dbChildren = documents.find((x) => x._id == id) 。
dbData.push(dbChildren)。
});
let formattedData = [];
dbData.map((child) =>/span> {
let newChild = [];
if (child.children.length > 1) {
newChild = child_recursion(child.children) 。
}
let formattedObject = {
id: child._id,
name: child.name,
depth: 0,
parent: child.parent,
closed: true,
children: newChild,
};
formattedData.push(formattedObject)。
if (newChild ==[]) {
return formattedData。
}
});
};
我在遞回中做錯了什么?謝謝你的幫助!
uj5u.com熱心網友回復:
你在這里得到的是將突變與遞回混合在一起,這往往會使事情變得更加混亂。
這一行告訴我的是:
這一行告訴我的是:
children。child_recursion(child.children)。
是你總是期望child_recursion回傳一個格式化的children陣列。
然而,在child_recursion中,你并不總是回傳什么。有時候,你正在突變一些東西。就我個人而言,我認為不使用突變往往更容易讓我的頭腦清晰。
因此,這個程序應該是這樣的:
- 給定一個物件 檢查該物件是否有子女
- 如果它有,就用這個函式轉換子物件 。
- 如果沒有,停止遞回 。
通過這種方式,我們可以將每個子物件轉換為一個物件,其子物件也被轉換,以此類推。
另外,你試圖一次性轉換所有的檔案,這一點也有些奇怪。相反,正如你在問題中所給出的,你應該專注于你試圖轉換的物件,并從那里往下作業。如果物件既可以是父母也可以是子女,那么你就有一個圖,而不是一棵樹,遞回的處理方式將與你所期望的不同。
我們其實不需要兩個函式來完成這個任務,只需要一個,而且在你已經擁有你要搜索的物件的情況下,你也可以將其傳遞給對方(如果你不直接洗掉檔案,而是從資料庫或某些服務中獲取它們的話)。我們還可以使用所謂的累加器,在遞回之前設定初始值,并在遞回程序中跟蹤它們。
const convert_children=(obj, documents)=> {
const convert_children_acc = (obj, documents, parent, depth) => {
let partial_format = {
id: obj._id,
name: obj.name,
depth: 深度。
parent: 父級。
close: 關閉。true。
}
if (obj.children && obj.children.length == 0) {
return {
...partial_format,
children: []
}
} else {
return {
...partial_format,
children: obj.children.map(child => {
child = documents.find(span class="hljs-params">x => child ==x._id)。
return convert_children_acc(child, documents, obj._id, depth 1)
})
}
}
}
return convert_children_acc(obj, documents, null, 0) 。
};
https://jsfiddle.net/5gaLw1y7/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/319292.html
標籤:
下一篇:遞回函式回傳意外的字串
