2014-09-21 2 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} 
    } 
} 

После йоЗотеЬЫпд работает на abc, я хочу someObject выглядеть следующим образом:

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

Так вопрос в том, как я могу отслеживать, где в someObject Я, наиболее эффективным способом? Или вообще возможно вообще отслеживать pointer?

Редактировать: В чистом Javascript или даже угловом в порядке. Нет jQuery пожалуйста :)

ответ

0

OK Я понял. Я полностью пропустил это, но любой вызов рекурсии будет содержать «указатель». В качестве примера, вот ответ на код. Я должен изменить способ объект был:

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

Если кто-то думает, что это плохой способ или есть лучший способ сделать это, пожалуйста, дайте мне знать :)

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