2016-01-16 3 views
0

Как я могу создать строку пути объекта? Например, сказать, что я хочу, чтобы включить следующий путь (а не его содержимое) в строку:Получить путь объекта и преобразовать его в строку в JavaScript

object = grandparent.children[2].children[4].whatever; 

мне нужна функция, как это:

function stringifyPath(obj) { 
    // somehow return "grandparent.children[2].children[4].whatever"; 
} 

ответ

1

Вы просто не можете сделать это в Javascript если каждый объект не сохраняет ссылку на свой собственный родительский элемент, и существует известный способ навигации по детям (например, DOM-узлы).

Это связано с тем, что, когда у вас есть объект, встроенный в другой объект (ваши родительские/дочерние отношения, о которых вы говорите), это не объект, встроенный в другой. Ребенок является независимым объектом, и в нем есть ссылка на него. Тот же самый ребенок может храниться во многих разных местах. С точки зрения 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/

+0

Спасибо за разъяснения и помощь. – americanknight

+0

@americanknight - Если это сообщение ответили на ваш вопрос, вы можете указать это сообществу, нажав зеленую галочку слева от ответа. Это также принесет вам несколько точек репутации для выполнения желаемой процедуры. Если он не ответил на ваш вопрос, пожалуйста, объясните, что еще не ответили. – jfriend00

Смежные вопросы