在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 (总体)