首页 > 试题广场 >

dom 节点查找

[编程题]dom 节点查找
  • 热度指数:56696 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
查找两个节点的最近的一个共同父节点,可以包括节点自身

输入描述:
oNode1 和 oNode2 在同一文档中,且不会为相同的节点

使用递归
function commonParentNode(oNode1, oNode2) {
            let parentNode1 = oNode1.parentNode;
            let parentNode2 = oNode2.parentNode;
            if(oNode1.contains(oNode2)){
                return oNode1;
            }else if(oNode2.contains(oNode1)){
                return oNode2;
            }
            // 节点为null时抛出,防止无限递归
            if(!parentNode1 || !parentNode2){
                return null
            }
            if(parentNode1.contains(oNode2)){
                return parentNode1
            }else if(parentNode2.contains(oNode1)){
                return parentNode2
            }else{
                commonParentNode(parentNode1,parentNode2)
            }
        }
发表于 2024-10-30 18:56:10 回复(0)
想到了这个方法,如果有更好的方法欢迎分享
            if (oNode1.parentNode === oNode2) return oNode2;
            if (oNode2.parentNode === oNode1) return oNode1;
            let parentNode1 = [oNode1];
            let parentNode2 = [oNode2];
            while(true) {
                if (oNode2) {
                    oNode2 = oNode2.parentNode;
                    if (parentNode1.includes(oNode2)) return oNode2;
                    parentNode2.push(oNode2);
                };
                if (oNode1) {
                    oNode1 = oNode1.parentNode;
                    if (parentNode2.includes(oNode1)) return oNode1;
                    parentNode1.push(oNode1);
                };
            };

编辑于 2024-03-04 23:59:31 回复(0)
function pathToRoot(node) {
    const ans = [];
    //console.log("call:");
    while(node != null) {
      //  console.log("**", node.className);
        ans.push(node);
        node = node.parentNode;
    }
    return ans;
}
function commonParentNode(oNode1, oNode2) {
    const p1 = pathToRoot(oNode1);
    const p2 = pathToRoot(oNode2);
    
    //console.log("path: ", p1);
    //console.log("path: ", p2);
    let r1  = p1.length - 1, r2 = p2.length - 1, lastNode = null;
    while(r1 >= 0 && r2 >= 0 && p1[r1] === p2[r2]) lastNode = p1[r1],r1--, r2--;
    return lastNode;
}

发表于 2023-05-20 18:52:21 回复(1)
function commonParentNode(oNode1, oNode2) {
 if(oNode1.contains(oNode2)){
   return oNode1.nodeName;
 } else {
   return commonParentNode(oNode1.parentNode, oNode2)
 }
}
发表于 2023-04-06 17:48:21 回复(0)
function commonParentNode(oNode1, oNode2) {
    let father1 = oNode1.parentNode
    let father2 = oNode2.parentNode
    if(father1 == father2){
        return father1
    }
    else{
        return father1 == oNode2 ? oNoder2:oNoder1
    }
}

发表于 2023-02-12 17:58:22 回复(0)
虽然通过了,但是不是全能的
function commonParentNode(oNode1, oNode2) {
      let parent1 = oNode1.parentNode
      let parent2 = oNode2.parentNode
      if(parent1 === parent2){
        return parent1
      }else if(parent1 === oNode2){
        return oNode2
      }else if(parent2 === oNode1){
        return oNode1
      }else{
        return commonParentNode(parent1,parent2)
      }
}


发表于 2022-12-04 16:41:43 回复(0)
function commonParentNode(oNode1, oNode2) {
   return oNode1.parentNode,oNode2.parentNode
}
啥呀还给我对了
发表于 2022-11-08 22:01:52 回复(0)
 //根据其他大佬的进行一个小修改:优先判断oNode2不包含oNode1,否则直接确定父节点
//在保证oNode2不包含oNode1后继续进行判断递归

function commonParentNode(oNode1oNode2) {
        if (!oNode2.contains(oNode1)) {
            if (oNode1.contains(oNode2)) {
                return oNode1;
            } else {
                return commonParentNode(oNode1.parentNodeoNode2);
            }
        } else {
            return oNode2;
        }
    }
发表于 2022-07-23 16:19:05 回复(0)
function commonParentNode(oNode1, oNode2) {
    while(!oNode1.contains(oNode2)){
        oNode1 = oNode1.parentNode
    }
    return oNode1
}
发表于 2022-07-22 10:32:49 回复(0)
function commonParentNode(oNode1, oNode2) {
    if (!oNode1 || !oNode2)return false
    if (oNode1.parentNode == oNode2) return oNode2;
    if (oNode2.parentNode == oNode1) return oNode1;
    if (oNode1 == oNode2) return oNode1;
    return commonParentNode(oNode1.parentNode,oNode2) ||  commonParentNode(oNode1,oNode2.parentNode)
}

发表于 2022-07-13 21:46:24 回复(0)
function commonParentNode(oNode1, oNode2) {
    // while循环
    while(!oNode1.contains(oNode2)){
        oNode1 = oNode1.parentNode
    }
    return oNode1
    // 递归
    if(oNode1.contains(oNode2)){
        return oNode1
    }
    return commonParentNode(oNode1.parentNode,oNode2)
}

发表于 2022-07-05 14:18:27 回复(0)
先递归获取两个节点的所有父节点包括自己用数组存起来 最后判断数组中的元素是否存在与另一个数组中
function commonParentNode(oNode1, oNode2) {
    let arr1 = []
    let arr2 = []
    getParentNode(oNode1, arr1)
    getParentNode(oNode2, arr2)
    return arr1.find( x => arr2.includes(x) )
}

function getParentNode(node, arr) {
    arr.push(node)
    if (node.parentNode === null) return
    getParentNode(node.parentNode, arr)
}
发表于 2022-06-24 09:39:14 回复(0)
function commonParentNode(oNode1, oNode2) {
    if (oNode1.contains(oNode2)) {
        return oNode1.parentNode
    } else {
        return oNode2.parentNode
    }
}
发表于 2022-06-20 17:00:11 回复(0)
function commonParentNode(oNode1, oNode2) {
    let p1 = oNode1.parentNode
    let p2 = oNode2.parentNode
    while (p1 != p2) {
        commoParentNode(p1, p2)
    }
    return p1
}
递归好慢呀
发表于 2022-06-15 22:03:34 回复(0)
while循环也不错

function commonParentNode(oNode1, oNode2) {
while(!oNode1.contains(oNode2)){
oNode1 = oNode1.parentNode
}
return oNode1
}

发表于 2022-02-24 10:47:34 回复(0)
function commonParentNode(oNode1, oNode2) {
    if(oNode1.parentNode == oNode2.parentNode){
        return oNode1.parentNode;
    }else{
        commonParentNode(oNode1.parentNode, oNode2.parentNode);
    }
}

发表于 2022-02-14 14:54:49 回复(0)
思路:
先判断下两者有什么位置情况
1包含2
2包含1
在同一层级
所以可以有
function commonParentNode(oNode1, oNode2) {
    //首先判断1是否包含2
    if(oNode1.contains(oNode2)){
        return oNode1
    }
    let fatherNode = oNode1.parentNode
    while(true){
        if(fatherNode.contains(oNode2) || fatherNode == oNode2){
            break;
        }
        else{
            fatherNode = fatherNode.parentNode
        }
    }
    return fatherNode
}

发表于 2022-02-11 16:04:52 回复(0)
function commonParentNode(oNode1, oNode2) {
    return oNode1.parentNode || oNode2.parentNode
}

发表于 2021-12-24 10:37:14 回复(0)

问题信息

难度:
31条回答 19381浏览

热门推荐

通过挑战的用户

查看代码
dom 节点查找