2014-09-21 151 views
2

我有下面这段代码为例:跟踪深度的对象

var someObject = { 
    id:'a', 
    l1:{ 
     id:'b', 
     l2:null 
    } 
}; 

var pointer = someObject; 
// seq = abc 
function doSomething(seq) { 
    while() { 
     Step 1: seq.charAt(0) is a === l0.id, therefore pointer = someObject.l1; 
     Step 2: seq.charAt(1) is b === l1.id, therefore pointer = pointer.l2; 
     Step 3: seq.charAt(2) is c !== l2.id, therefore: 
      pointer = { id: c, l3:null} 
    } 
} 

DoSomething的上abc运行后,我想someObject的样子:

var someObject = { 
    id:'a', 
    l1:{ 
     id:'b', 
     l2:{ 
      id:'c', 
      l3:null 
     } 
    } 
}; 

所以问题是,我如何以最有效的方式跟踪我在哪里someObject?或者实际上是否可以跟踪pointer

编辑:在纯Javascript或甚至棱角很好。没有jQuery请:)

回答

0

好吧,我想通了。我完全错过了这一点,但任何递归调用都会保存“指针”。作为一个例子,这里是代码的答案。我没有要修改的方式,目的是:

var someObject = { 
    id:'a', 
    l:{ 
     id:'b', 
     l:{} 
    } 
}; 

和当然,只是这个例子的目的,以次总是会添加到什么已经在对象。也就是说,如果a> b> c,那么seq将总是匹配“abc”+任何额外的,例如。 “abcd”

function doSomething(seq, index, obj) { 
    if(seq.charAt(index) === obj.id) { 
     obj = obj.l; 
     index++; 
     doSomething(seq, index, obj) 
    } else { 
     obj.id = seq.charAt(index); 
    } 
} 

正如您所看到的,我们能够继续引用指向的原件而不是副本。

输出:{ id: 'a', l: { id: 'b', l: { id: 'c' } } }

如果有人认为这是个不错的方法或有这样做的更好的方法,请让我知道:)