2017-12-21 7 views
1

filterは同じですが、それは二つの異なる要素に適用される結果: d3.js /効率的なJavaScriptコード

mNode.filter(function(otherNode) { 
    return connectedNodes.indexOf(otherNode.id) > -1 
}).select("image").style("opacity", BACKGROUND_OPACITY); 

mNode.filter(function (otherNode) { 
    return connectedNodes.indexOf(otherNode.id) > -1; 
}).select("circle").style("stroke", "#f6f6f6"); 

は、どのように私は、コードを複製することなく、1 filterにそれを組み合わせることができますか?

2番目に、より効率的な反対に適用する方法はありますか?

mNode.filter(function(otherNode) { 
    return connectedNodes.indexOf(otherNode.id) > -1 
}).select("image").style("opacity", BACKGROUND_OPACITY); 
mNode.filter(function(otherNode) { 
     return connectedNodes.indexOf(otherNode.id) == -1 
}).select("image").style("opacity", DEFAULT_OPACITY); 

条件が満たされている場合は、1番目のスタイルを適用し、2番目のスタイルを適用します。

ありがとうございます!あなたの最初の質問に答える

+0

'for'を使って 'mNode'を繰り返し、' if ... else'を使ってスタイルを適用します。 – Tushar

+0

@Tushar 'mNode'は配列ではなく、そのフィルタは' Array.prototype.filter'ではない、それは同じ名前の別のメソッドです(混乱しています、私は知っています...)。だから、 'のための'はここで動作しません。 –

答えて

1

:ちょうど選択を使用します。

var filtered = mNode.filter(function(otherNode) { 
    return connectedNodes.indexOf(otherNode.id) > -1 
}); 

をそして:

filtered.select("image").style("opacity", BACKGROUND_OPACITY); 
filtered.select("circle").style("stroke", "#f6f6f6"); 

あなたの2番目の質問は、もう少し複雑であり、さまざまなソリューションを持っています。私はeachを使ってすべてのノードをチェックします。ような何か:

mNode.each(function(d) { 
    if (connectedNodes.indexOf(d.id) > -1) { 
    d3.select(this).select("image").style("opacity", BACKGROUND_OPACITY); 
    } else { 
    d3.select(this).select("image").style("opacity", DEFAULT_OPACITY); 
    } 
}) 

はしかし、私は直感的に、あなたのコードがeachよりも高速である、ことを言うだろう。 jsPerfのようなツールを使用して、常に両方のソリューションをテストできます。

+0

私は 'each'で作業しようとしていますが、ノード上にスタイルを適用する方法がわかりません(idから) – ItayB

+1

'd3.select(this)。スタイル(etc ...) ' –

+0

チェックすると、私は更新します、ありがとう! – ItayB