Búsqueda de sitios web

javascript - Obtener el promedio de cada elemento de múltiples arreglos en un solo arreglo


Bueno, mi cerebro se está derritiendo... Estoy tratando de lograr lo siguiente:

Sé cuántos arreglos y cuántos elementos tiene cada arreglo. Estos números son dinámicos, pero digamos que hay: 3 arreglos con 18 elementos en cada uno.

Ejemplo :

["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"]

Ahora quiero obtener el promedio del elemento 1 de los tres arreglos, y del elemento 2 de los tres y así sucesivamente.

El resultado final debería ser un arreglo con el promedio de los 18 elementos.

Algo como:

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

Esto funcionaría si 3 estuviera fijo, pero la cantidad de arrays es dinámica.

Espero que esto tenga sentido...

Respuesta #1

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

Respuesta #2

Marcaste esta pregunta con underscore.js, así que puedes usar el método _.zip. Esto pone todos los primeros elementos de un arreglo juntos y así sucesivamente. Luego puedes promediar cada uno de esos arreglos.

Ver 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://stackoverflow.com/a/10394791/327074
  return _.zip.apply(null, arrays).map(avg)
}

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

Con funciones flecha de 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