2011-11-03 7 views
0

다차원 배열의 모든 값의 평균을 계산하려면 어떻게해야합니까? 1 차원 배열에서 평균을 계산하는 함수를 작성했지만, 1 차원 이상이있을 때 가장 좋은 방법이 무엇인지 잘 모르겠습니다. 예를 들어JavaScript의 다차원 배열의 전체 평균 계산하기

, 이제 우리는 다음 있다고 가정 해 봅시다 :

A = 0 1 
    1 2 
    2 3 

그래서 나는를 찾으려면 : 따라서

var A = Array(3); 
for (i=0; i<A.length; i++) { 
    A[i] = new Array(2); 
    for (j=0; j<A[i].length; j++) { 
     A[i][j] = i+j; 
    } 
} 

, A는 2 차원 배열, 또는 3 × 2 행렬 모든 값의 평균.이 경우 1.5와 같을 것입니다. 나는 모든 평균값의 새로운 1 차원 배열을 만들 필요가 있다고 상상한다. 그러나 배열이 고차원 인 경우 (예 : 5x3x6x9)이 작업을 수행하는 가장 쉬운 방법은 확실하지 않습니다.

감사합니다.

편집

감사합니다 여러분! 나는 당신의 조언을 사용하고 reduce 함수를 사용하는 첨부 된 링크 중 하나에서 찾은 코드를 사용하여 배열을 평평하게했다. 내 평균화 기능은 다음과 같이 지금 :

function average(x) { 

    // Flatten multi-dimensional array 
    while (x[0] instanceof Array) { 
     x = x.reduce(function(a, b) { return a.concat(b); }); 
    } 

    // Calculate average 
    return x.reduce(function(a, b) { return a + b; })/x.length; 
} 
+0

을 평평하게하는 것입니다. 이 기능을 수학 과제에서 어떻게 구현합니까? –

답변

1

당신은 다차원 배열 평평하게 this code를 사용할 수 있습니다

function flatten(array){ 
    var flat = []; 
    for (var i = 0, l = array.length; i < l; i++){ 
     var type = Object.prototype.toString.call(array[i]).split(' ').pop().split(']').shift().toLowerCase(); 
     if (type) { flat = flat.concat(/^(array|collection|arguments|object)$/.test(type) ? flatten(array[i]) : array[i]); } 
    } 
    return flat; 
} 

을 한 후 단지 합계와 분할 :

var total = 0; 
for (var i = 0, l = flattenedArray.length; i<l; i++) { 
    total += flattenedArray[i]; 
} 
var average = total/flattenedArray.length; 
+1

외부 링크는 답변에 훌륭한 보조 *이지만 항상 관련 코드 *도 대답으로 복사합니다 *. 외부 리소스는 이동하거나, 삭제되거나, 무관하게 만드는 방식으로 수정 될 수 있습니다. 스택 오버플로는 OP 질문에 지금 답변하는 것뿐만 아니라 미래에 같은 종류의 질문이있는 사람들에게도 의미가 있습니다. –

+0

Okay @ T.J.Crowder, 할 것이다 : – Benjie

1

I 돈 새 배열을 만들어야하는 특별한 이유가 있는지 확인하십시오. 그냥 가지고있는 코드를 반복하십시오 :

var i, j, sub, total, count, avg; 

total = count = 0; 
for (i = 0; i < A.length; ++i) { 
    sub = A[i]; 
    count += sub.length; 
    for (j = 0; j < sub.length; ++j) { 
     total += sub[j]; 
    } 
} 
avg = count === 0 ? NaN : total/count; 

위의 내용은 배열이 희소하지 않은 것으로 가정합니다 (예제에는 포함되어 있지 않습니다).

function flatten(arr) { 
    var acc = []; 
    var f = function(arr) { 
     for (var i = 0; i < arr.length; ++i) { 
      if (arr[i] instanceof Array) { 
       f(arr[i]); 
      } 
      else { 
       acc.push(arr[i]); 
      } 
     } 
    }; 
    f(arr); 
    return acc; 
} 

을 그리고 당신은 당신의 함수로 평균을 계산할 수 있습니다

1

이 기능을 사용하여 다차원 배열을 평평하게 할 수 있습니다.

+0

'iframe과 같은 여러 창을 사용할 수있는 환경에서는'x instanceof Array'가 신뢰할 만하지 않습니다. 배열을 실제로 처리하고 있는지 여부를 확인하는 가장 확실한 방법은'Object.prototype.toString.call (x) === "[object Array]"'입니다. –

+0

@ T.J.Crowder : 여러 개의 '창'이 사용되는 경우 좋은 조언. 감사! –

+0

Array.isArray()를 사용할 수도 있습니다. 브라우저 지원에 대해 잘 모르겠지만 – frogstarr78

1

은 // 가장 간단한 방법은 배열 당신은 예상 로직을 정의해야

Array.prototype.flatten= function(){ 
var A= []; 
this.forEach(function(itm){ 
    if(!itm || !itm.flatten)A.push(itm); 
    else{ 
     A= A.concat(itm.flatten()); 
    } 
}); 
return A; 
} 
// shim for older browsers (without array forEach) 
Array.prototype.forEach= [].forEach || function(fun, scope){ 
    var T= this, L= T.length, i= 0; 
    if(typeof fun== 'function'){ 
     while(i< L){ 
      if(i in T){ 
       fun.call(scope, T[i], i, T); 
      } 
      ++i; 
     } 
    } 
    return T; 
} 

var a=[[1,2,3,[1,2,3]],[4,5,6,[7,8,[1,2,3,[1,2]]]],11,[1,[2,[2,4,[5]]]]]; 
a.flatten().join('\n') 

/* returned value: (String) 
1 
2 
3 
1 
2 
3 
4 
5 
6 
7 
8 
1 
2 
3 
1 
2 
11 
1 
2 
2 
4 
5 
*/