将数组从许多值简化为更少

Simplify array from many values to fewer

我有一个包含很多数字 (165) 的数组,我想 'simplify' 将数组 'simplify' 减少到更少的数字 (50)。减少的数组应该仍然代表 165 个原始数字。

例如: 如果我有这个包含 8 个值的数组 [2, 4, 3, 8, 1, 4, 9, 3] 并要求将其减少到 4 个值,我想接收这个数组 [3, 5.5, 2.5, 6]

目前我有一个函数,当减少的数字和原始数字可以相除时(如 8 和 4),但是当我尝试使用它时,假设 165 个值应该简化为 50 个值,它 returns我54个值:

const array = [28, 71, 64, 116, 128, 8, 78, 172, 142, 96, 12 ... 165 values]
const valuesToSum = Math.floor(array.length / 50); // 50 is the wanted array length 
for (let i = 0; i < array.length; i++) {
    if (i % valuesToSum !== 0 || i === 0) {
        sum += array[i];
    } else {
        returnArray.push(sum / valuesToSum);
        sum = 0;
    }  
}
return returnArray;

最后这应该是一个 JavaScript 函数,但如果有人能在数学层面上向我解释一下,那将对我有很大帮助。

为了获得您想要的确切组数,您不能对要分组的元素数进行四舍五入。例如,如果你想从 165 减少到 50,一些组将有 3 个元素,一些将有 4 个。

为此,请使用嵌套循环。外循环按组的大小递增,而内循环在组内递增 1。将此内部索引转换为数组索引时会发生舍入。

const array = [28, 71, 64, 116, 128, 8, 78, 172, 142, 96, 12]

function reduceArray(array, newSize) {
  const returnArray = [];
  const valuesToSum = array.length / newSize;
  for (let i = 0; i < array.length; i += valuesToSum) {
    let sum = 0;
    let j;
    let start_i = Math.floor(i);
    for (j = start_i; j < Math.min(start_i + valuesToSum, array.length); j++) {
      sum += array[j];
    }
    returnArray.push(sum/(j - start_i));
  }
  return returnArray;
}

console.log(reduceArray(array, 4));

const bigArray = [];
for (let i = 0; i < 165; i++) {
  bigArray.push(Math.floor(Math.random() * 200));
}
let result = reduceArray(bigArray, 50);
console.log(result.length);
console.log(result);