2017-03-01 27 views
1

假設我有一個很大的SPA,我可以看看它的來源。現在有一個對象包含我想查看和/或爲調試目的而更改的數據。如何在Javascript控制檯中獲取對象的全名和「路徑」?

我可以把console.log(myObject)代碼和它得到的控制檯,這是很好的顯示...但我怎麼能輸出完整的路徑全名在當前窗口的對象,所以我可以打開一個JS控制檯,例如輸入:

window.myApp.something.anothersomthing[12].myObject

,然後讓我的對象?我能找到的就是如何打印這種類型,但是這沒有幫助。有任何想法嗎?

+1

很多時候,你想要的路徑是不可能的(例如如果'something'是一個函數的對象不會是全球性的,這樣開頭的路徑'窗口「是不可能的,因爲對象只在函數的範圍內定義)! –

+1

同樣可能有多條路徑到同一個對象。或者對象圖中可能有周期。該圖不是簡單的單數樹,也不是DAG。 – Richard

+0

好點,ibrahim,這是真的。但是,我們現在假設對象路徑*存在*。 – Robert

回答

0

這是一個非常天真的實現,它可以讓你搜索一個對象圖並找到該對象的路徑。

有許多需要注意的地方:

  1. 正如你可以在摘要中看到,我在window.myApp通過以啓動從搜索的環境。如果你通過window,你會遇到一些錯誤。
    例如,在Chrome中,window.clientInformation.plugins[0] === window.clientInformation.plugins[0]的計算結果爲false,從而無法跟蹤已訪問的對象。

  2. 有一些實現細節可能導致下面的腳本行爲不當(getter,proxies,generators,...)。

function search(object, context) { 
 
    let found = []; 
 
    let visited = []; 
 

 
    let visit = (object, reference, path) => { 
 
    if (object === reference) { 
 
     found.push(path); 
 
    } 
 

 
    if (!visited.includes(reference)) { 
 
     visited.push(reference); 
 

 
     if (Array.isArray(reference)) { 
 
     for (let i = 0; i < reference.length; i++) { 
 
      visit(object, reference[i], path + '[' + i + ']'); 
 
     } 
 
     } else if (reference === Object(reference)) { // test for object 
 
     for (let key in reference) { 
 
      visit(object, reference[key], path + '.' + key); 
 
     } 
 
     } 
 
    } 
 
    } 
 

 
    visit(object, eval(context), context); 
 

 
    return found; 
 
} 
 

 
// example 
 
let myObject = {}; 
 
let myApp = { 
 
    something: { 
 
    anotherSomething: [null, null, null, null, null, null, null, null, null, null, null, null, { 
 
     myObject: myObject 
 
    }] 
 
    } 
 
}; 
 

 
window.myApp = myApp; 
 

 
console.log(search(myObject, 'window.myApp'));

相關問題