我知道如何使用堆疊轉換簡單的遞回函式(就像這里描述的那樣),但是,一些遞回函式有一個棘手的部分,我不知道如何實作。更簡單的遞回函式不會更改呼叫者區域變數(呼叫者是指呼叫自身的函式),或者換句話說,更簡單的遞回函式不會根據呼叫自身的回傳值更改它們的區域變數,但是當它變得棘手時它需要改變它,我不知道如何用堆疊實作做同樣的事情。這是一個簡化的示例:
const obj = {
src: {
size: 0,
children: {
api: {
size: 0,
children: {
api_2: {
size: 0,
children: {
'file1.js': {
size: 2,
},
'file2.js': {
size: 2,
},
},
},
api_1: {
size: 0,
children: {
'test1.js': {
size: 1,
},
'test2.js': {
size: 1,
},
},
},
},
},
},
},
};
const recursive = (object) => {
if (object.children) {
const currentChildren = object.children;
Object.entries(currentChildren).forEach(([, child]) => {
object.size = recursive(child);
});
return object.size;
} else {
return object.size;
}
};
recursive(obj.src);
console.log(obj.src.size);
console.log(obj.src.children.api.size);
console.log(obj.src.children.api.children.api_1.size);
console.log(obj.src.children.api.children.api_2.size);
// Output: 6 6 2 4
如果我的問題令人困惑,只需使用堆疊實作這個遞回函式就可以幫助我理解我的問題。
uj5u.com熱心網友回復:
您可以通過將最后一個元素與它們的父元素一起彈出并再次添加訪問過的節點(如果它有子元素)來對堆疊使用深度優先搜索。flag防止再次添加它。這種方法訪問節點兩次,一次用于搜索最深度節點,另一次用于更新size屬性。
const
update = object => {
const
stack = [[object]];
while (stack.length) {
const [o, p, flag] = stack.pop();
if (!flag && o.children) {
stack.push([o, p, true]);
Object.values(o.children).forEach(q => stack.push([q, o]));
} else if (p) p.size = o.size;
}
},
obj = { src: { size: 0, children: { api: { size: 0, children: { api_2: { size: 0, children: { 'file1.js': { size: 2 }, 'file2.js': { size: 2 } } }, api_1: { size: 0, children: { 'test1.js': { size: 1 }, 'test2.js': { size: 1 } } } } } } } };
update(obj.src);
console.log(obj.src.size); // 6
console.log(obj.src.children.api.size); // 6
console.log(obj.src.children.api.children.api_1.size); // 4
console.log(obj.src.children.api.children.api_2.size); // 2
console.log(obj.src);
.as-console-wrapper { max-height: 100% !important; top: 0; }
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/412575.html
標籤:
