我该如何计算多维数组中所有值的平均值呢?我写了一个函数来计算从一个一维数组的平均值,但我不确定什么是最好的方法,当有超过1维。
例如,假设我们有以下内容:
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是一个二维数组,或3x2矩阵:
A = 0 1
1 2
2 3
所以我想找到所有值的平均值,在这种情况下等于1.5。假设我需要创建一个包含所有值的新的一维数组,然后我可以把它输入到我的平均函数中。但是,当数组是高维的(例如5x3x6x9)时,我不确定最简单的方法。
谢谢!
编辑
谢谢大家!我已经使用了您的建议,并使用我在其中一个使用减少函数的附加链接中发现的代码将数组夷为平地。我的平均函数现在是这样的:
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;
}
您可以使用以下代码来平整化多维数组:
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;
我看不出你有什么特别的理由需要创建一个新的数组。只要循环遍历你有的:
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;
注意,上面的假设数组不是稀疏的(它们不在您的示例中)。
//最简单的方法是将数组平展
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
*/
您可以使用以下函数来平整化多维数组:
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;
}
然后你可以用你的函数计算平均值