我的思路是用css的nth-child()选择器做筛选。
target
// js部分
function isString (target) {
return typeof target === 'string';
}
function findNode (parent, child) {
if (!(isString(parent) && isString(child))) {
return;
}
const path = child.split('.');
let str = `${parent}>*`;
for (let i = 0, len = path.length; i < len; i++) {
str += `:nth-child(${path[i]})${i === len - 1 ? '' : '>*'}`;
}
//body>*:nth-child(1)>*:nth-child(2)>*:nth-child(2)>*:nth-child(1)>*:nth-
//child(2)>*:nth-child(1)>*:nth-child(1)>*:nth-child(2)>*:nth-child(2)>*:nth-
//child(1)>*:nth-child(2)>*:nth-child(1)
console.log(str);
return document.querySelector(str);
}
console.log(findNode('body', '1.2.2.1.2.1.1.2.2.1.2.1')); //
target
这肯定不是最好的解法,因为还是需要做遍历,如果目标节点的位置嵌套过深,例如上万的嵌套,那么按上面那样逐个输入位置就肯定不行了,同时性能估计也很差。
感觉楼上说的二叉树遍历比较接近题目的要求,算法方面我自己也不是很熟,只能想到这个方法。