Javascript - ссылка на вложенные объекты - PullRequest
2 голосов
/ 14 января 2012

У меня довольно сложный вложенный объект, например:

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

И по какому-то алгоритму я нашел d

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

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

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 14 января 2012

Пока ваш алгоритм находит 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 голосов
/ 14 января 2012

Если я правильно понимаю, то, что вы ищете, это путь к d - "b.c.d". Так что если у вас есть 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"
...