如何生成对象路径的字符串?例如,说我想将以下路径(而不是其内容)转换为字符串:
object = grandparent.children[2].children[4].whatever;
我需要这样的功能:
function stringifyPath(obj) {
// somehow return "grandparent.children[2].children[4].whatever";
}
最佳答案
除非每个对象都存储对其自身父对象的引用,并且存在一种导航子对象的已知方法(就像DOM节点一样),否则您根本无法在Javascript中做到这一点。
这是因为当您将一个对象嵌入另一个对象(您所说的父子关系)时,它实际上并不是一个嵌入在另一个对象中的对象。子对象是一个独立的对象,父对象中有对其的引用。同一孩子可以被存放在许多不同的地方。从Javascript的角度来看,它实际上没有父代。这是许多不同的事物可能引用的对象。
如果每个子对象都存储了对自己父对象的引用,并且有一种已知的方式可以遍历任何级别的子对象,则可以编写代码来构建一条像您所说的那样的路径,但是您必须成为关于这些对象的确切含义以及如何找出给定对象是哪个子索引的更多细节。
例如,如果这些是同时满足两个条件的DOM对象(子对象包含对父对象的引用,并且有一种已知方法可以导航任何给定对象的子对象),并且您希望根父对象为document.body
,则可以执行这个:
function getSiblingPosition(obj) {
var siblings = obj.parentNode.children;
var elemCnt = 0;
for (var i = 0; i < siblings.length; i++){
if (siblings[i] === obj) {
return elemCnt;
} else {
if (siblings[i].nodeType === 1) {
++elemCnt;
}
}
}
}
function getPath(obj) {
var path = "";
while (obj && obj !== document.body) {
var cnt = getSiblingPosition(obj);
path = ".children[" + cnt + "]" + path;
obj = obj.parentNode;
}
path = "document.body" + path;
return path;
}
工作演示:https://jsfiddle.net/jfriend00/8w9v8kpf/