2017-03-01 1 views
1

Angenommen, ich habe einen großen SPA, dessen Quelle ich untersuchen kann. Jetzt gibt es irgendwo ein Objekt, das Daten enthält, die ich untersuchen und/oder für Debugging-Zwecke ändern möchte.Wie erhalten Sie den vollständigen Namen und den Pfad eines Objekts in einer Javascript-Konsole?

kann ich ein console.log(myObject) im Code setzen und es wird in der Konsole angezeigt, das ist schön ... aber wie kann ich Ausgang des vollständige Pfad oder vollständige Namen des Objekts im aktuellen Fenster, so dass ich eine JS-Konsole öffnen und zum Beispiel ein:

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

und dann mein Objekt erhalten? Alles, was ich finden konnte, ist, wie man den Typ druckt, aber das hilft nicht. Irgendwelche Ideen?

+1

Eine Menge Zeit, der Weg, den Sie ist unmöglich wollen (wenn zum Beispiel 'something' eine Funktion ist, wird das Objekt nicht global sein, damit ein Weg, der mit' beginnen Fenster "ist unmöglich, da das Objekt nur im Rahmen der Funktion definiert wird!" –

+1

Ebenso kann es mehrere Pfade zum selben Objekt geben. Oder es gibt Zyklen im Objektdiagramm. Die Grafik ist kein einfacher Singulärbaum oder eine DAG. – Richard

+0

Guter Punkt, Ibrahim, das stimmt. Nehmen wir an, dass der Objektpfad * existiert *. – Robert

Antwort

0

Hier ist eine sehr naive Implementierung, mit der Sie ein Objektdiagramm für ein Objekt suchen und die Pfade, auf denen dieses Objekt angetroffen wird, ausdrucken können.

Es gibt eine Reihe von Einschränkungen:

  1. Wie Sie im Code-Schnipsel sehen, ich in window.myApp als Kontext Pass aus der Suche zu starten. Wenn Sie window übergeben, werden Sie eine Reihe von Fehlern auftreten.
    Zum Beispiel wird in Chrome window.clientInformation.plugins[0] === window.clientInformation.plugins[0] zu false ausgewertet, was die Verfolgung von bereits besuchten Objekten unmöglich macht.

  2. Es gibt eine Reihe von Implementierungsdetails, die dazu führen können, dass das folgende Skript sich schlecht verhält (Getter, Proxys, Generatoren, ...).

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'));

Verwandte Themen