跟踪对象的深度

时间:2014-09-21 22:28:21

标签: javascript angularjs

我将以下代码作为示例:

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}
    }
}

abc上运行doSomething之后,我希望someObject看起来像:

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

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

编辑:在纯Javascript甚至角度很好。请不要jQuery:)

1 个答案:

答案 0 :(得分:0)

好的,我明白了。我完全错过了这个,但任何递归调用都会保留“指针”。作为一个例子,这是代码的答案。我确实需要修改对象的方式:

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

当然,仅仅为了这个例子,seq总是会添加到对象中已经存在的东西。也就是说,如果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' } } }

如果有人认为这是一种不好的方式,或者有更好的方法,请告诉我:)