将多个数组中每个元素的平均值放入一个数组中

6

我的头脑有些混乱...我试图完成以下任务:

我知道有多少个数组和每个数组有多少元素。这些数字是动态的,但假设有3个数组,每个数组中有18个元素。

示例:

["106","142","112","77","115","127","87","127","156","118","91","93","107","151","110","79","40","186"]

["117","139","127","108","172","113","79","128","121","104","105","117","139","109","137","109","82","137"]

["111","85","110","112","108","109","107","89","104","108","123","93","125","174","129","113","162","159"]

现在我想要得到三个数组中第一个元素的平均值,以及所有三个数组中的第二个元素的平均值等等。

最终结果应该是一个包含所有18个元素平均值的数组。

类似于:

var result_array = [];
for (i = 0; i < 3; i++) {  
  result_array.push(arrayone[i] + arraytwo[i] + arraythree[i]) / 3
}

这个方案可以解决3固定的情况,但是数组数量是动态的。希望这样说得通…

数组大小是否总是相同的? - TimCodes
是的,它们在每个循环中都具有相同的大小。但是数组的数量每次不同。 - Martin Lyder
实际上,这些数组来自逗号分隔的项目数组。通过拆分将它们变成数组,在for循环中使用... - Martin Lyder
6个回答

6

var arrays = [
    [106,142,112,77,115,127,87,127,156,118,91,93,107,151,110,79,40,186],
    [117,139,127,108,172,113,79,128,121,104,105,117,139,109,137,109,82,137],
    [111,85,110,112,108,109,107,89,104,108,123,93,125,174,129,113,162,159],
    [104,153,110,112,108,109,107,89,104,108,123,93,125,174,129,113,162,159]
    /* Can be any amount of arrays */
    ],
    result = [];

//Rounding to nearest whole number.
for(var i = 0; i < arrays[0].length; i++){
  var num = 0;
  //still assuming all arrays have the same amount of numbers
  for(var i2 = 0; i2 < arrays.length; i2++){ 
    num += arrays[i2][i];
  }
  result.push(Math.round(num / arrays.length));
}

alert(result);


1

你在这个问题中标记了underscore.js,所以你可以使用_.zip方法。这将把所有第一个元素放在一起,依此类推。然后你可以对每个数组求平均值。

请参见CodePen

var arr1 = ["106","142","112","77","115","127","87","127","156","118","91","93","107","151","110","79","40","186"]
var arr2 = ["117","139","127","108","172","113","79","128","121","104","105","117","139","109","137","109","82","137"]
var arr3 = ["111","85","110","112","108","109","107","89","104","108","123","93","125","174","129","113","162","159"]
// ... as many more arrays as you want

var avgEmAll = function (arrays) {
  // zip with array of arrays https://dev59.com/nGPVa4cB1Zd3GeqP4lEw#10394791
  return _.zip.apply(null, arrays).map(avg)
}

// average an array https://dev59.com/T2kv5IYBdhLWcg3wxjrQ#10624256
var avg = function (x) {
  return x.reduce(function (y, z) {return Number(y) + Number(z)}) / x.length
}
console.log(avgEmAll([arr1, arr2, arr3]))

使用ES6箭头函数(CodePen):
const avgEmAll = arrays => _.zip.apply(null, arrays).map(avg)
const sum = (y, z) => Number(y) + Number(z)
const avg = x => x.reduce(sum) / x.length

0

这里的答案是使用循环。我们将你的数组称为arr1、arr2和arr3。

var averages = [];

for(i = 0; i < arr1.length; i++) {
    var a = arr1[i];
    var b = arr2[i];
    var c = arr3[i];
    var avg = (a + b + c) / 3;
    averages.push(avg);
}

在此循环的每次迭代中,它将会执行以下操作:
- 将每个数组的下一个数字分配给一个变量(从索引0开始)
- 找到这三个数字的平均值
- 将计算结果添加到平均数数组中。

问题实际上是要求一个可变数量的数组,这就是 OP 无法完成的部分。事实上,该问题已经有一个几乎完全相同的代码了。 - icc97

0
用Java写了这个解决方案,但你可以得到逻辑上的帮助。希望能对你有所帮助。
ArrayList<Integer> averageArrayList = new ArrayList<>();
int arrayListLength = arrayList1.length(); //assuming previous arraylists have same size.


   for(int i=0; i<arrayListLength; i++){
        int averageValue = (arrayList1.get(i) + arrayList2.get(i) + arrayList3.get(i)) / 3;
        //adds average value to current index.
        averageArrayList.add(i, averageValue);
    }
//averageArrayList is ready with your values..

0

此函数将接收任意数量的数组并计算它们的平均值。它使用+运算符自动将字符串转换为数字。它是动态的,因为它不关心数组的长度或数量,只要它们的长度相等即可(根据问题可以假设它们长度相同)。由于我们可以假设它们都具有相同的长度(基于问题),所以它遍历第一个数组的长度。它不进行四舍五入,因为这不是要求中提到的。

function average_of_arrays(...arrays) {
  let result = [];
  for(let array_index in arrays[0]) {
    let total = 0;
    for (let arr of arrays) {
      total += +arr[array_index]
    }
    result.push(total / arrays.length);
  }
  return result;
}

let arr1 = ["106", "142", "112", "77", "115", "127", "87", "127", "156", "118", "91", "93", "107", "151", "110", "79", "40", "186"];

let arr2 = ["117", "139", "127", "108", "172", "113", "79", "128", "121", "104", "105", "117", "139", "109", "137", "109", "82", "137"];

let arr3 = ["111", "85", "110", "112", "108", "109", "107", "89", "104", "108", "123", "93", "125", "174", "129", "113", "162", "159"];

function average_of_arrays(...arrays) {
  let result = [];
  for(let array_index in arrays[0]) {
    let total = 0;
    for (let arr of arrays) {
      total += +arr[array_index]
    }
    result.push(total / arrays.length);
  }
  return result;
}


console.log(average_of_arrays(arr1, arr2, arr3));


0
var result = getAvg( [ 1, 2, 3 ], [ 2, 3, 4 ] )

console.log( result ) // [ 1.5, 2.5, 3.5 ]

function getAvg() {

  var a = arguments
  var nar = a.length
  var nel = a[ 0 ].length
  var el, ar, avg, avgs = []

  for( el = 0; el < nel; ++el ) {
    avg = 0
    for( ar = 0; ar < nar; ++ar ) avg += a[ ar ][ el ]
    avgs[ el ] = avg / nar
  }

  return avgs

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接