2017-08-31 7 views
2

JavaScriptとd3については比較的新しいですが、私は力に基づくレイアウトに本当に関心があります。マイク・ボストックの力指向の可視化では、彼は次のコード(または類似)を使用して、リンクのリストからノードを解析する傾向がある:説明Mike Bostockノード解析ループ

var links = [ 
    {source: "A", target: "B"}, 
    {source: "B", target: "C"}, 
    {source: "C", target: "A"}]; 

var nodes = {}; 

links.forEach(function(link) { 
    link.source = nodes[link.source] || (nodes[link.source] = {name: link.source}); 
    link.target = nodes[link.target] || (nodes[link.target] = {name: link.target}); 
}); 

私は完全に彼が最終的にここに達成するかを理解、私はJavaScriptを理解したいですforEachループ内の構文(実際には、まったく)。誰かが説明できるなら、本当に感謝します。

明らかに非常にエレガントなコードですが、インターネット上のどこにでも説明がありません。検索で重要な用語が不足している可能性があるので、ここでは戸惑うほど質問しています。何が本当に私を投げている:

  • ||のどちらかの側の2つの割り当てを行う、
  • 各行(各||の左側)の最初の割り当ての順序:なぜそれがありますlink.source = nodes[link.source]は、例えば、nodes[link.source] = link.sourceではありません。

    link.source = nodes[link.source] || (nodes[link.source] = {name: link.source});

    以下のコードで

答えて

2

nodes[link.source]ない未定義ある場合は

link.source = nodes[link.source]

を意味します。

nodes[link.source]の場合、未定義の場合、以下のブロックが実行されます。

(nodes[link.source] = {name: link.source})//assigning new value to nodes[link.source]

と上記の値は、あなたがそれを簡単にあれば、それはのようになるので、link.source

に設定されます。

link.source = nodes[link.source] || (nodes[link.source] = {name: link.source}); と同等です:

if (!nodes[link.source]) {//not undefined 
link.source = nodes[link.source]; 
} else { 
nodes[link.source] = {name: link.source} 
link.source = nodes[link.source]; 
} 

お役に立てれば!

あなたのコメントについて説明

質問(a = b || c equates to a = b but if b is undefined make a = c, right?)

YES

質問まだこれらの割り当ての左側がリンクされている理由の意味は何がありません。 sourceとlink.targetは既に定義されていますが、ノードを設定する必要がありますか?

はい!あなたはここに正しいですThose are already definedです。 リンク。source is currently = "A" ブロックが実行された後、各link.sourceはオブジェクトのようなものを指します。 link.source = {name:A}

まだ混乱がある場合は教えてください。

+0

これは、構文を理解するのに役立ちます(a = b || cはa = bと同じですが、bが未定義の場合はa = c、そうですか?)。それでもなお意味をなさないのは、これらの課題の左側がlink.sourceとlink.targetなのはなぜですか?それらはすでに定義されています。ノードを設定する必要があります。それはちょうど巧妙な方法ですか?特定のソースまたはターゲットがノードにない場合に実行する – twgardner2

+0

コメントの追加説明 – Cyril