2017-10-18 91 views
3

我想了解遞歸如何使用可能具有相同鍵名的嵌套js對象。例如在下面的對象中,鍵在嵌套中是相同的。 因此,當我循環時,我期待obj[keys]將始終走第一行(標記爲//第1行)。無法理解嵌套javascript對象中的遞歸行爲

我想了解如何js會知道如果所有的鍵具有相同的名稱考慮哪個嵌套循環。不知道在那裏當你說obj[keys]是隻查找名字上obj的關鍵,我錯了理解

var obj = { 
 
    a: {   // Line 1 
 
    a: {  // Line 2 
 
     a: {  // Line 3 
 
     sweptArea: 5 
 
     } 
 
    } 
 
    } 
 
} 
 

 
function loop(obj, keyName) { 
 
    for (var keys in obj) { 
 
    if (obj.hasOwnProperty(keys) && typeof obj[keys] === 'object') { 
 
     if (obj[keys][keyName] !== undefined) { 
 
     console.log(obj[keys][keyName]) 
 
     } else { 
 
     // In my understanding in all the iteration it will point to obj.a marked as line one 
 
     loop(obj[keys], 'sweptArea') 
 
     } 
 
    } 
 

 
    } 
 

 
} 
 

 
loop(obj, 'sweptArea')

+1

因爲'loop'函數中的'obj'是指'obj'參數而不是'obj'變量? –

+1

在頂層,您將'obj'傳遞給'loop'。在第一次遞歸調用中,你傳遞了'obj.a'太循環。當然,你正在第二次遞歸調用中傳遞'obj.a' * *,但是這個調用有自己的具有不同值的'obj'參數。看一下你實際傳遞'obj.a.a'等等的頂層。 –

+0

它可能無助於你的理解,即外部變量和參數都被稱爲'obj'。 –

回答

4

。這個表達本身並沒有遞歸。

每次調用該函數時,傳遞給定義爲obj參數的變量的值都是不同的。