2016-04-28 11 views
1

Wie kann ich einen Verweis auf ein Objekt in Javascript haben? Ich habe den folgenden Code:Baum wie Struktur in Javascript erstellen

// define nodes 
var NodeA = new Object(); 
var NodeB = new Object(); 

NodeA = { 
    name: "A", 
    children: [ 
     NodeB 
    ] 
} 

NodeB = { 
    name: "B", 
    children: [] 
}; 

var test = NodeA.children[0].name; 
// How can I make test = "A" ??? <---------------- 
alert(test); 

Ich weiß, dass, wenn ich NodeB vor dem Erstellen von NodeA erstellen wird es mein Problem lösen.

+0

'NodeB' löst einen Verweis auf ein Objekt auf, aber Sie erstellen ein völlig neues Objekt mit' NodeB = {...} '(und ordnen ihn dann der gleichen Variablen zu). Variablen und Werte sind zwei verschiedene Dinge. –

Antwort

4

Sie können Object.assign verwenden Eigenschaften NodeB zuweisen anstelle NodeB der Einstellung ein Verweis auf ein völlig neues Objekt zu sein:

var NodeB = {}; 
 

 
var NodeA = { 
 
    name: "A", 
 
    children: [ 
 
     NodeB 
 
    ] 
 
} 
 

 
Object.assign(NodeB, { 
 
    name: "B", 
 
    children: [] 
 
}); 
 

 
var test = NodeA.children[0].name; 
 
alert(test);

Beachten Sie, dass Sie es für Internet Explorer von Object.assign Unterstützung müssen die Polyfill verwenden. Sie können auch zuweisen nur die Objekte, die dem vorhandenen Objekt stattdessen Objektliteral Notation der Verwendung eines neuen zu erstellen:

var NodeB = {}; 
 

 
var NodeA = { 
 
    name: "A", 
 
    children: [ 
 
     NodeB 
 
    ] 
 
} 
 

 
NodeB.name = "B"; 
 
NodeB.children = []; 
 

 
var test = NodeA.children[0].name; 
 
alert(test);

+0

Sollte es sein: 'Object.assign' ?? Du stellst da versehentlich ein Komma ein, denke ich. –

+0

@EvanBechtol Ja, danke. – Paulpro

+0

Beachten Sie, dass ['.assign's Kompatibilität] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#Browser_compatibility) in Browsern nicht so gut ist im Augenblick. –

1

Warum nicht verwenden, um eine Funktion Konstruktor:

function Node(name) { 
 
    this.name = name, 
 
    this.children = []; 
 
} 
 

 
var nodeA = new Node('A'), 
 
    nodeB = new Node('B'); 
 

 
nodeA.children.push(nodeB); 
 

 
document.write(nodeA.children[0].name); 
 
document.write('<pre>' + JSON.stringify(nodeA, 0, 4) + '</pre>');

+1

das funktioniert auch. Vielen Dank! –

+0

Nina, was ist der Unterschied? Wenn Sie dann 'nodeB' einen neuen Wert zuweisen, ändert sich' nodeA.children' nicht. – isvforall

+0

@isvforall, wenn Sie einer Variablen einen Wert zuweisen, ist der letzte Wert/Referenz verloren. oder vermisse ich etwas? –

0

Wenn Sie zuweisen ein neuer Wert die Referenz des Objekts zu entfernen und dann können Sie nicht auf das Objekt zuzugreifen, dass innerhalb children Array

NodeB = { 
    name: "B", 
    children: [] 
}; 

Sie dot Notation eine neue Eigenschaften zuweisen können:

NodeB.name = "B"; 
NodeB.children = []; 

Beispiel:

var NodeA = new Object(); 
 
var NodeB = new Object(); 
 

 
NodeA = { 
 
    name: "A", 
 
    children: [ 
 
     NodeB 
 
    ] 
 
} 
 

 
NodeB.name = "B"; 
 
NodeB.children = []; 
 

 
var test = NodeA.children[0].name; 
 

 
alert(test);

Verwandte Themen