2011-11-03 82 views
0

我该如何计算多维数组中所有值的平均值?我已经写了一个函数来计算一维数组的平均值,但我不确定什么时候最好的方法是多于一维的。用JavaScript计算多维数组的整体平均值

例如,假设我们有以下几点:

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矩阵:

A = 0 1 
    1 2 
    2 3 

所以我想找到所有值的平均值,在这种情况下将等于1.5。我想我需要创建一个新的所有值的一维数组,然后将其输入到平均值函数中。但是,我不确定当数组高度维度时(例如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

好的@ T.J.Crowder,会做:) – Benjie

1

我不没有看到您需要创建新阵列的任何特定原因。只要通过你的那些循环:

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; 

注意的是,上述假设数组不是稀疏的(他们是不是在你的例子)。

1

您可以使用此功能扁平化您的多维数组:

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; 
} 

然后你就可以用你的函数计算平均值。

+0

'x instanceof Array'在可能使用多个窗口(如iframe)的环境中不可靠。找出你真正处理数组的最可靠的方法是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 
*/