Skip to content

在JavaScript中对数字数组执行数学运算

数字数组是一种非常常见的数据结构,您经常需要对其执行某些操作。最常见的操作是计算数组中数字的总和平均值乘积中位数。让我们看看如何使用JavaScript来实现这些操作。

[!NOTE]

下面的一些函数是可变参数函数,意味着它们可以接受任意数量的参数。您可以使用扩展运算符(...)将数字数组传递给这些函数。

数组的总和

数组的总和是将数组中的所有数字相加的结果。

使用Array.prototype.reduce(),您可以通过将每个值添加到初始值为0的累加器中来轻松计算数字数组的总和。

const sum = (...arr) =>
  [...arr].reduce((acc, val) => acc + val, 0);

sum(1, 2, 3, 4); // 10
sum(...[1, 2, 3, 4]); // 10

数组的平均值

数组的平均值是将数组中的所有数字相加,然后将结果总和除以数组的长度得到的结果。

你可以使用与对数组求和相同的技巧,然后使用Array.prototype.length将结果求和除以数组的长度。

const average = (...arr) =>
  [...arr].reduce((acc, val) => acc + val, 0) / arr.length;

average(...[1, 2, 3]); // 2
average(1, 2, 3); // 2

数组的乘积

数组的乘积是将数组中的所有数字相乘的结果。

你可以使用Array.prototype.reduce()将每个值与初始值为1的累加器相乘。

const prod = (...arr) =>
  [...arr].reduce((acc, val) => acc * val, 1);

prod(1, 2, 3, 4); // 24
prod(...[1, 2, 3, 4]); // 24

数组的中位数

数组的中位数是排序后的中间数。如果数组有奇数个元素,中位数就是中间的数。如果数组有偶数个元素,中位数是中间两个数的平均值。

你可以使用Array.prototype.sort()来对值进行排序,然后根据Array.prototype.length的奇偶性返回中间位置的数字或者两个中间数字的平均值。

const median = arr => {
  const mid = Math.floor(arr.length / 2),
    nums = [...arr].sort((a, b) => a - b);
  return arr.length % 2 !== 0 ? nums[mid] : (nums[mid - 1] + nums[mid]) / 2;
};

median([5, 6, 50, 1, -5]); // 5

数组的加权平均值

数组的加权平均值是通过将数组中的每个数字与相应的权重相乘,将结果相加,然后将结果除以权重的总和得到的。

你可以使用Array.prototype.reduce()来将每个值与相应的权重相乘并将结果相加,然后将结果除以权重的总和。

const weightedAverage = (nums, weights) => {
  const [sum, weightSum] = weights.reduce(
    (acc, w, i) => {
      acc[0] = acc[0] + nums[i] * w;
      acc[1] = acc[1] + w;
      return acc;
    },
    [0, 0]
  );
  return sum / weightSum;
};

weightedAverage([1, 2, 3], [0.6, 0.2, 0.3]); // 1.72727

数组的标准差

数组的标准差是衡量数组中的值与平均值的差异程度的指标。为了计算标准差,你需要计算数组的平均值,然后计算每个值与平均值的差异,将差异平方,计算平方差的平均值,最后取结果的平方根。

使用Array.prototype.reduce()Math.sqrt(),可以计算出给定值的平均值、方差和方差和的和,并确定标准差。你可以添加一个可选的第二个参数usePopulation,以获取总体标准差。


const standardDeviation = (arr, usePopulation = false) => {
  const mean = arr.reduce((acc, val) => acc + val, 0) / arr.length;
  return Math.sqrt(
    arr
      .reduce((acc, val) => acc.concat((val - mean) ** 2), [])
      .reduce((acc, val) => acc + val, 0) /
      (arr.length - (usePopulation ? 0 : 1))
  );
};

standardDeviation([10, 2, 38, 23, 38, 23, 21]); // 13.284434142114991 (样本)
standardDeviation([10, 2, 38, 23, 38, 23, 21], true);
// 12.29899614287479 (总体)