2016-08-07 5 views
2

this questionの後に、英国の新聞の日々の感情分析を表すD3グラフのJs変数を作成するDRY方法を作成したいと思います。ここでグローバルな未定義変数に動的にアクセスする(D3の例)DRY

は私のスクリプトからいくつかのサンプルコードです:

var guardian,independent; // many more here 
var gLine,gChart; // many more here 
var iLine,iChart; // many more here 

私はオブジェクト内の新聞固有の変数を格納しています:

var allObjects = { guardian : {line : gLine,chart : gChart}, 
independent : {line : iLine,chart : iChart}}// and so on for each newspaper     

次のように私は関数を使用して変数を割り当てます。

function makeLine(name){return d3.svg.line().y(function(d) { return y(d[name]); }); } 
// and so on for each newspaper attribute in AllObjects 

いつも自分を繰り返しているのではなく、各オブジェクトind ividually:

正常に動作します
makeLine('guardian'); makeLine('independent'); // etc 

...、私はすべての新聞を反復できるようにし、すべての新聞のための単一の機能を持つオブジェクトを割り当てる、のようなものでしょう:

var allFunctions = {line: makeLine(),chart: makeChart()}; 

    function make(type){ 
    var myFunc = allFunctions.type; 
    for(var prop in allObjects){prop.type = myFunc(type);} 
} 

make(line)gLineiLine、割り当てるなるようになど

問題がallObjects.guardian内の変数が定義されていないとして、この方法が機能していないということです。

このようにリファクタリングする方法についてのご意見はありますか?

+3

:-)実際にここでは痛みを感じないようにしようとしていますが、「完全」とは、問題を捉えたり、実行したりすることができることを意味します。特に、makeLineが何をすべきかを見るのは難しいd3があなたのコールバックを呼び出している 'd'オブジェクトによる間接指定を考えてください。もともと* more *詳細で質問を投稿するように提案したのは、イライラしてしまいました。あなたがする必要があるものを作ることができたら、私はあなたがそれをやるのを手助けすることができます、そして、私はちょうど上からそれを得ることができません。 –

答えて

3

のではなく自分自身にすべての時間を繰り返し、個別に各オブジェクトを作る:正常に動作します

makeLine('guardian'); makeLine('independent'); // etc 

を...、私はすべての新聞を反復できるようにしたい、とオブジェクトを割り当てますすべての新聞

私はその権利を読んでいる場合のために、単一の機能で、あなたの「のようなものは、」本当に近い、コメントを参照してください。

var allFunctions = {line: makeLine, chart: makeChart}; 
// Note no() here ----------------^ or here --------^ 
// We want the reference to the function, we don't want to call it (yet) 

// Assuming `type` is "line", "chart", etc. 
function make(type){ 
    // Note brackets: We want the property whose name is in the type 
    // variable, not a property actually called "type" 
    var myFunc = allFunctions[type]; 
    //      ^----^------ We want the property whose name is in 
    //         the `type` variable, not a property 
    //         actually *called* "type" 
    for (var prop in allObjects) { 
     allObjects[prop][type] = myFunc(prop); 
     //  ^----^-----^----------- Brackets again as above 
    } 
} 
+0

Blast、私は 'type'と' prop'を混同しました。最後の行は、 'allObjects [prop] [type] = myFunc(prop);';それがあなたが見るものでないなら、リフレッシュしてください。 –

+0

基本的に私は、JSの変数がOOPプログラミングのようなオブジェクトではなく、参照であることを認識していませんでした。今すぐ働きます、ありがとう。 –

+0

@Jonathan_W:私は "参照...、オブジェクト自体ではない"とは思えません... JavaScriptの変数は、JavaやC#のような他のOOP言語の変数と本質的に同じです。これらの言語では、変数に**値**が含まれ、値は数値やブール値などでも、オブジェクト参照でもかまいません。これらのすべての言語で、変数にオブジェクト参照が含まれている場合、オブジェクト自体は変数とは別に存在します(変数にはオブジェクトではなく参照が含まれます)。この点でJSには大きな違いはありません。 –

関連する問題