我最近採訪了Facebook的一個前端工程師的職位。對於我的手機屏幕,我是以下問題:給定DOM樹中的節點,從相同的DOM樹中找到相同位置的節點。爲清晰起見,請參見下圖。DOM樹遍歷
A B
O O
|\ |\
O O O O
/|\ /|\
O O O O O O
\ \
O O
這是我的解決方案,我想知道我能做些什麼來改進/優化它。
var rootA, rootB;
function findNodeB(nodeA) {
// Variable to store path up the DOM tree
var travelPath = [];
// Method to travel up the DOM tree and store path to exact node
var establishPath = function(travelNode) {
// If we have reached the top level node we want to return
// otherwise we travel up another level on the tree
if (travelNode === rootA) {
return;
} else {
establishPath(travelNode.parentNode);
}
// We store the index of current child in our path
var index = travelNode.parentNode.childNodes.indexOf(travelNode);
travelPath.push(index);
}
var traverseTree = function(bTreeNode, path) {
if(path.length === 0) {
return bTreeNode;
} else {
traverseTree(bTreeNode.childNodes[path.pop()], path);
}
}
establishPath(rootB, nodeA);
return traverseTree(rootB, travelPath);
}
你沒有得到這份工作? – alex
我沒有 - 面試過程中的口頭反饋很好,所以我想我必須錯過我的解決方案。 – thedjpetersen
您是否特意要求使用遞歸?迭代在這種情況下會簡單得多。另外,我們有關於DOM樹/結構/元素類型的_zero_信息?除了childNode數組中的索引位置之外,沒有可用的信息? –