我有一個樹資料結構,每個物件都包含子物件:
const data = {
id: 1,
name: "John",
parent_id: null,
children: [{
id: 2,
name: "Tess",
parent_id: 1,
children: []
},
{
id: 3,
name: "Tom",
parent_id: 1,
children: [{
id: 4,
name: "Harry",
parent_id: 3,
children: [{
id: 7,
name: "Thabo",
parent_id: 4,
children: []
}]
},
{
id: 5,
name: "Mary",
parent_id: 3,
children: []
},
{
id: 6,
name: "Madge",
parent_id: 3,
children: []
}
]
}
]
}
在向樹中添加新物件之前,我需要確定當前使用的最高值,以便為新用戶id分配下一個可用編號。id
為此,我創建了一個初始值為 0 的新變數。然后我遍歷樹中的每個物件,如果物件的id值高于新 id,我將新 id 分配給當前 id 的值(這個想法正在最終值加 1 得到新的 id)。
let newUserID = 0;
const newID = ( root, idKey ) => {
if ( root.id > idKey ) {
idKey = root.id;
}
root.children.forEach( ( obj ) => {
newID( obj, idKey );
});
return idKey;
}
newUserID = newID( data, newUserID );
console.log( newUserID );
我希望這會回傳id樹中的最高值作為最終值,但實際發生的是,雖然新 id 確實會增加,直到它與最大值匹配,然后它又開始減少,以 1 結束。
這可以在這個JSFiddle中看到,其中包括一些日志記錄以在函式的不同點顯示新 ID 的值。
我已經使用不同的方法解決了這個問題(將id值提取到一個新陣列中,并使用Math.max()它來查找最大值),但我想了解為什么我的初始方法沒有按預期作業。我可以看到idKey值正在更新,但是之前的值在遞回呼叫中被傳回,但我不知道為什么會發生這種情況或如何防止它。
uj5u.com熱心網友回復:
首先,關于為什么你的代碼被破壞:你只是錯過了一個任務。你在哪里
newID( obj, idKey );
您忽略了結果值。您需要將其分配回idKey:
idKey = newID( obj, idKey );
這將解決你的問題。我們還應該注意,變數名稱newUserID有點用詞不當,因為它不是您將使用的新名稱,而是找到的最高名稱。也許highestUserID會不那么混亂?
然而,我們應該指出,這可以寫得更簡單,Math .max用來做繁重的作業和一些遞回。我可以這樣寫:
const maxId = ({id, children = []}) =>
Math .max (id, ... children .map (maxId))
const data = {id: 1, name: "John", parent_id: null, children: [{id: 2, name: "Tess", parent_id: 1, children: []}, {id: 3, name: "Tom", parent_id: 1, children: [{id: 4, name: "Harry", parent_id: 3, children: [{id: 7, name: "Thabo", parent_id: 4, children: []}]}, {id: 5, name: "Mary", parent_id: 3, children: []}, {id: 6, name: "Madge", parent_id: 3, children: []}]}]}
console .log (maxId (data))
uj5u.com熱心網友回復:
只需將遞回呼叫的回傳值分配給idKey:
let newUserID = 0;
const newID = ( root, idKey ) => {
if ( root.id > idKey ) {
idKey = root.id;
}
root.children.forEach( ( obj ) => {
idKey = newID( obj, idKey ); // <--------
});
return idKey;
}
newUserID = newID( data, newUserID );
console.log( newUserID );
如果沒有這個賦值,無論你遞回多少,回傳的值將只取決于if頂部陳述句的結果。這解釋了你得到的日志。
uj5u.com熱心網友回復:
你可以使用遞回來解決這個問題。像下面
const data = {
id: 1,
name: "John",
parent_id: null,
children: [
{
id: 2,
name: "Tess",
parent_id: 1,
children: [],
},
{
id: 3,
name: "Tom",
parent_id: 1,
children: [
{
id: 4,
name: "Harry",
parent_id: 3,
children: [
{
id: 7,
name: "Thabo",
parent_id: 4,
children: [],
},
],
},
{
id: 5,
name: "Mary",
parent_id: 3,
children: [],
},
{
id: 6,
name: "Madge",
parent_id: 3,
children: [],
},
],
},
],
};
const findMax = (value) => {
let max = -Infinity;
const _findMax = (data) => {
if (max < data.id) max = data.id;
data.children.forEach(_findMax);
};
_findMax(value);
return max;
};
console.log(findMax(data));
uj5u.com熱心網友回復:
你可以做:
const data = {id: 1,name: 'John',parent_id: null,children: [{ id: 2, name: 'Tess', parent_id: 1, children: [] },{id: 3,name: 'Tom',parent_id: 1,children: [{id: 4,name: 'Harry',parent_id: 3,children: [{ id: 7, name: 'Thabo', parent_id: 4, children: [] }],},{ id: 5, name: 'Mary', parent_id: 3, children: [] },{ id: 6, name: 'Madge', parent_id: 3, children: [] },],},],}
const arr = [...JSON.stringify(data).matchAll(/"id":(\d )/g)].map(([, n]) => n)
const result = Math.max(...arr)
console.log(result)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/477493.html
標籤:javascript 数组 递归
