2012-01-13 5 views
2

у меня есть довольно сложный вложенный объект, например:Javascript - Обращение к вложенным объектам

A = {b : {c : { d : [{e:false},{g:true}] } } } 

И через какой-то алгоритм я нашел d

Теперь у меня есть клон A, Z = clone(A)

Я хочу иметь возможность изменять d в Z. Как я могу как-то сохранить позицию d, чтобы я мог перейти в эту позицию в Z и изменить ее. Если бы это был список, я мог бы просто сохранить индекс и изменить его с тем же индексом. Я мог бы, конечно, искать дерево для d, но я не могу считать уникальные имена свойств, и даже если бы я мог это замедлить

Любые идеи?

+0

Хранить стек свойств, как вы найдете D. – SLaks

+0

'd' не имеет ** ** положение в Z, так что вы не можете - свойства объектов в JavaScript не имеет фиксированных позиций, объекты нельзя сортировать по той же причине. единственный способ для вас взаимодействовать с ним - это его имя, которое, кстати, можно смело предположить, уникально для этого объекта, поскольку объект js не может иметь двух отдельных свойств с тем же именем. –

+0

Спасибо. По uniquness я имею в виду что-то вроде этого a = {b: [{b: true}, 1]}. Вы не могли бы «искать» для b в этом случае, но, как вы сказали, я должен взаимодействовать через имя – zenna

ответ

3

Пока ваш алгоритм находит d, создайте коллекцию свойств, чтобы указать, как можно найти d. В этом случае, это будет выглядеть так

["b", "c", "d"] 

Затем вы можете перебрать коллекцию, чтобы пройти Z для клона d:

properties = ["b", "c", "d"]; 
newD = Z; 
for(var i = 0; i < properties.length; i++){ 
    newD = newD[properties[i]]; 
} 
0

Если я правильно понимаю, что вы ищете является путь к d - «bcd». Так что если у вас есть D--

//untested, should return path in dot notation b.c.d 
function findPath(o,t,n,p){ 
    if (typeof p=='undefined') { 
    p=''; 
    } 
    if (typeof n=='undefined') { 
    n=''; 
    } 
    if (o===t) { 
    if (p=='') { 
     return n; 
    }else{ 
     return p+'.'+n; 
    } 
    } 
    if (typeof o!='object') { 
    return p; 
    } 
    for (var i in o) { 
    var j=o[i]; 
    var xp=p; 
    p=findPath(j,d,i,p); 
    if (xp!=p) {// found 
     return p; 
    } 
    } 
    return p; 
} 
// call it 
var s=findPath(A,d); 
// s="b.c.d" 
Смежные вопросы