2016-08-07 4 views
2

this question에서이어서 영국 신문의 일별 정서 분석을 나타내는 D3 그래프의 Js 변수를 만드는 DRY 방법을 만들고 싶습니다.동적으로 정의되지 않은 전역 변수에 액세스하는 경우 (D3의 예) DRY

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

다음과 같이 내가 함수를 사용하여 변수를 할당 :

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

내가 객체에 신문 특정 변수를 저장하고 다음은

내 스크립트의 몇 가지 예제 코드입니다

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)gLine, iLine 할당 것이다 그래야 등

문제는 allObjects.guardian에서 변수가 정의되지 않은 한,이 방법이 작동하지 않는 것입니다.

이러한 방식으로 리팩토링하는 방법에 대한 제안 사항은 무엇입니까?

+3

:-) 실제로 고통을 느끼지 않으려 고하지만 "완료"는 문제를보고 실행하고 볼 수있는 것을 의미합니다. 특히 makeLine이해야 할 일이 무엇인지 알기가 어렵습니다. d3이 콜백을 호출하는'd' 객체를 통한 간접 지정을 감안할 때. * 더 자세한 * 정보가 포함 된 질문을 올리라고 제안한 이유 때문에 좌절하지 않아서 미안합니다. :-)하지만 당신이해야 할 일을 알아낼 수 있다면, 나는 당신이 그것을 할 수 있도록 도울 수 있습니다, 그리고 나는 단지 위에서 그것을 얻을 수 없습니다. –

답변

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

폭발, 나는'type'과'prop'을 혼동했다. 마지막 줄은'allObjects [prop] [type] = myFunc (prop);'; 그것이 당신이 보는 것과 다르다면 새로 고침을하십시오. –

+0

기본적으로 JS에서의 변수는 OOP 프로그래밍에서와 같이 객체 자체가 아니라 참조라는 사실을 깨닫지 못했습니다. 이제 작동합니다. 고마워요. –

+0

@Jonathan_W : 나는 "... 참조, 스스로있는 객체가 아닙니다 ..."JavaScript의 변수는 Java 나 C# 같은 다른 OOP 언어의 변수와 본질적으로 동일합니다. 이 모든 언어에서 변수는 ** 값 **을 포함하고 값은 숫자 또는 부울 등일 수도 있고 객체 참조 일 수도 있습니다. 이 모든 언어에서 변수에 객체 참조가 포함되어 있으면 객체 자체가 변수와 별도로 존재합니다 (변수에는 객체가 아닌 참조가 포함되어 있음).JS와 관련해서는 큰 차이가 없습니다. –

관련 문제