2016-04-28 3 views
1

JavaScriptへの参照はどうすればできますか?私はノードAを作成する前に、ノードBを作成した場合、それは私の問題を解決することを知っているjavascriptで木のような構造を作成

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

:私は、次のコードを持っています。

+0

'NodeB'はオブジェクトへの参照に解決しますが、あなたは' NodeB = {...} 'で完全に新しいオブジェクトを作成しています(そして、それは同じ変数に割り当てられます)。変数と値は2つの異なるものです。 –

答えて

4

あなたは完全に新しいオブジェクトへの参照する代わりにNodeBを設定するNodeBにプロパティを割り当てるためにObject.assignを使用することができます。

var NodeB = {}; 
 

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

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

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

なお、あなたが希望Object.assignサポートのInternet ExplorerのPolyfillを使用する必要があります。 あなたはまただけではなく、新しいものを作成するために、オブジェクトリテラル表記を使用する既存のオブジェクトにプロパティを割り当てることができます:

var NodeB = {}; 
 

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

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

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

+0

する必要があります: 'Object.assign' ??誤ってカンマを置いていると思います。 –

+0

@EvanBechtolはい、ありがとうございます。 – Paulpro

+0

ブラウザでの['.assign'の互換性](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#Browser_compatibility)はそれほど素晴らしいものではありません現時点では。 –

1

を関数コンストラクタは使用しない理由:

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

これも機能します。ありがとう! –

+0

ニナ、違いは何ですか? 'nodeB'に新しい値を代入すると、' nodeA.children'は変更されません。 – isvforall

+0

@isvforall、変数に値を代入すると、最後の値/参照は失われます。または私は何かが恋しいですか? –

0

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

例:あなたは、オブジェクトの参照を削除すると、あなたがchildren配列

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

の内側にあなたは新しいプロパティを割り当てるためにdot表記を使用できるオブジェクトにアクセスすることはできません新しい値:

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

関連する問題