2014-11-02 7 views
0

Javascript에서는 데이터 집합에 대해 작업을 수행 할 배열 집합이 있고 때로는 모든 배열을 포함하지 않고 조합을 포함하려는 경우에 시나리오를 처리하는 가장 좋은 방법은 무엇입니까?프로그래밍 무지 프로그래밍

내 배열은이 작은 스 니펫 L, C, H, V, B, A, S로 레이블되어 있으며,이 코드는 약 2,500 줄에 해당합니다. (이 게시물에서 코드 노트를 제거한)

if(C[0].length>0){ 
    L=L[1].concat(+(MIN.apply(this,L[0])).toFixed(7)); 
    C=C[1].concat(C[0][0]); 
    H=H[1].concat(+(MAX.apply(this,H[0])).toFixed(7)); 
    V=V[1].concat((V[0].reduce(function(a,b){return a+b}))/(V[0].length)); 
    B=B[1].concat((MAX.apply(this,B[0])-MIN.apply(this,B[0]))/2); 
    A=A[1].concat((MAX.apply(this,A[0])-MIN.apply(this,A[0]))/2); 
    D=D[1].concat((D[0].reduce(function(a,b){return a+b}))/(D[0].length)); 
    S=S[1].concat((S[0].reduce(function(a,b){return a+b}))/(S[0].length)); 
    } 
그것은 비생산적 쓰레기로이 경우 각 루프 또는 코드 섹션에 요청 부울 조건의 톤 코드가 배열이 작업에 포함 된 경우 보인다

인라인 조건을 사용하여 각 루프 반복을 묻는 것이 훨씬 어리 석다. 이렇게하면 처리 속도가 느려지고 코드가 미로 또는 토끼 구멍처럼 보이게됩니다. 옵션을 false

로 설정된 경우

는 지시를 무시하거나 생략 할 수있는 논리적 방법/라이브러리는 지금까지 함께 온 모든

var op=[0,1,1,0,0,0,0,0]; //options 

var L=[],C=[],H=[],V=[],B=[],A=[],D=[],S=[]; 

op[0]&&[L[0]=1]; 
op[1]&&[C[0]=1,console.log('test, do more than one thing')]; 
op[2]&&[H[0]=1]; 
op[3]&&[V[0]=1]; 
op[4]&&[B[0]=1]; 
op[5]&&[A[0]=1]; 
op[6]&&[A[0]=1]; 

그것은 작동 가지 의미가 인라인 일이 있습니까 옵션에서 요구하는대로 C[0]H[0]을 1로 설정하지만 루프 내에서 수행 될 수 있으므로 루프 반복마다 7 가지 질문을해야하므로 실패합니다. 루프 또는 코드 섹션의 7 가지 버전을 만드는 대신 각 루프 내부에 질문을하는 대신 다른 스타일/방법이 있습니까?

나는 또한 내가 어떤 점에서 다음 배열을 만드는 경우가 NaN 동일보다는 정의되지 않은하거나 콘솔 내가 따뜻해지고

var L=[],C=[],H=[],V=[],B=[],A=[],D=[],S=[]; 

L=NaN; 
L[0]=1; 
//1 
console.log(L); //NaN 

L=undefined; 
L[0]=1 
//TypeError: Cannot set property '0' of undefined 

L=null 
L[0]=1 
//TypeError: Cannot set property '0' of null 

암을 불평하지 않는 널 (null) 것으로 나타났습니다? 나는 수학이 수행되고 있지만 저장되지 않았기 때문에 L[0]에서 약간의 수학을 수행했다면 실제로는 무시되지 않도록 라인이 무시된다고 가정합니다.

+0

NaN은 숫자입니다. L을 다른 임의의 수, L [0] = 1로 설정하면 똑같은 일이 발생합니다. – Winchestro

+3

정말 의도를 얻기가 어렵습니다. 코딩 스타일은 매우 이국적이지만 좋은 방식은 아닙니다. "더 이상 읽지 않고, 디버그하고, 장기적으로 유지 관리해야합니다"라는면에서 더욱 그렇습니다. 특정 질문이 있으시거나 체크 아웃을 원할 것입니다. – Winchestro

+0

이 질문은, 초기 옵션을 지속적으로 참조하지 않고 초기 옵션을 기반으로 동작을 유지하는 방법은 무엇입니까? – 8DK

답변

1

내가 원하는 것을 이해한다면 나는 이와 같은 것을 할 것입니다.

var op = [...], 
    opchoice = { 
     //these can return nothing, no operation, or a new value. 
     'true': function(val){ /*operation do if true*/ }, 
     'false': function(val){ /*operation do if false*/ }, 
     //add more operations here. 
     //keys must be strings, or transformed into strings with operation method. 
     operation: function(val){ 
      //make the boolean a string key. 
      return this[''+(val == 'something')](val); 
     } 
    }; 

var endop = [];//need this to prevent infinite recursion(loop). 
var val; 
while(val = op.shift()){ 
    //a queue operation. 
    endop.push(opchoice.operation(val)); 
} 

나는 이것이 당신이 원하는 것을 정확히되지 확신 해요,하지만 조건의 톤 모든 곳이 없기 때문에 희망을 실현에 가까이.

다른 옵션은 모든 행에 적용됩니다.

A = isNaN(A) ? A.concat(...) : A; 

개인적으로 나는 다른 방법을 선호합니다.

+0

매우 흥미로운 코드 – 8DK

+0

감사. 도움이 되니? 나는 당신의 요구 사항을 이해하는데 약간의 어려움을 겪었다. 나는 주로 인라인 조건의 제거를 고려했다. –

0

많은 작업을 반복하는 것처럼 보입니다. 이러한 연산은 함수 여야하므로 적어도 동일한 함수를 반복하여 재정의하지 마십시오 (이렇게하는 것이 최적화이기도 함).

function get_min(x) 
{ 
    return +(MIN.apply(this, a[0])).toFixed(7); 
} 

function get_max(x) 
{ 
    return +(MAX.apply(this, a[0])).toFixed(7); 
} 

function get_average(x) 
{ 
    return (x[0].reduce(function(a, b) {return a + b}))/(x[0].length); 
} 

function get_mean(x) 
{ 
    return (MAX.apply(this, x[0]) - MIN.apply(this, x[0]))/2; 
} 

if(C[0].length > 0) 
{ 
    L = L[1].concat(get_min(L)); 
    C = C[1].concat(C[0][0]); 
    H = H[1].concat(get_max(H)); 
    V = V[1].concat(get_average(V)); 
    B = B[1].concat(get_mean(B)); 
    A = A[1].concat(get_mean(A); 
    D = D[1].concat(get_average(D)); 
    S = S[1].concat(get_average(S)); 
} 

프로토 타입 기능을 사용하여 개체를 정의 할 수도 있지만 유용할지 여부는 명확하지 않습니다 (네임 스페이스에 해당 기능을 넣지 않은 경우).

테스트를 받는다는 아이디어/개념과 관련하여 자바 스크립트에서 가장 잘 나온 방법은 아마도 가장 좋은 방법 일 것입니다.op[0]에 해당하는 경우 여러 연산자를 적용 할 경우

op[0] && S = S[1].concat(get_average(S)); 

는 그리고 사용 괄호와 쉼표 :

op[3] && (V = V[1].concat(get_average(V)), 
      B = B[1].concat(get_mean(B)), 
      A = A[1].concat(get_mean(A)); 

op[0] && (D = D[1].concat(get_average(D)), 
      S = S[1].concat(get_average(S))); 

그러나이는 경우() 블록보다는 프로그래머, 어떤 명확하지 않다 귀하의 질문에 표시됩니다. (실제로, 많은 프로그래머는 그것을 얻기 전에 2 ~ 3 번 읽어야 할 수도 있습니다.)

그러나 다른 기능 레이어를 사용하는 또 다른 해결책이 있습니다. 마지막 예에서, 당신은 같은 것을 할 것입니다 :

function VBA() 
{ 
    V = V[1].concat(get_average(V)); 
    B = B[1].concat(get_mean(B)); 
    A = A[1].concat(get_mean(A)); 
} 

function DS() 
{ 
    D = D[1].concat(get_average(D)); 
    S = S[1].concat(get_average(S)); 
} 

op = [DS,null,null,VBA,null,null,...]; 

for(key in op) 
{ 
    // optional: if(op[key].hasOwnProperty(key)) ... -- verify that we defined that key 
    if(op[key]) 
    { 
     op[key](); // call function 
    } 
} 

그래서 다른 말로하면 기능의 배열을 가지고 다양한 항목을 통해 이동하여 정의 된 경우, 함수를 호출하는 for() 루프를 사용할 수 있습니다.

이 모든 것들은 가지고있는 조합의 수에 따라 크게 달라집니다. 2,500 줄의 코드를 언급했지만 순열의 수는 한 줄 또는 다른 줄을 쓰면 줄의 총 수를 줄이지 않을 수 있지만 많은 줄이 훨씬 작은 코드로 옮겨지기 때문에 유지 보수가 더 쉬워집니다. 스 니펫을 통해 전반적인 프로그램을 더 쉽게 이해할 수 있습니다.

P. 나중에 쉽게 읽고 디버그 할 수 있도록 위와 같이 공백을 넣는 것이 좋습니다. 공간을 절약하려면 압축기 (최소화 기), Google 또는 Yahoo! 둘 다 정말 좋은 직업을 가지고 있습니다. 미리 압축 된 코드를 작성할 필요가 없습니다.