本文介绍如何在 react native 中为数组中每个位置计算“截至当前索引(不含首项)的累积平均值”,即第 i 项对应前 i 个 volume 值(索引 0 到 i−1)的平均值,适用于动态展示传感器读数趋势等场景。
在 React Native 开发中,常需对时间序列数据(如传感器读数)进行实时统计处理。题中需求并非简单数组均值,而是一种前缀累积平均(running average excluding self):对于长度为 n 的 readings 数组,目标是生成一个新数组 averages,其中:
| 索引 i | readings[i] | averages[i](定义) | 计算过程 |
|---|---|---|---|
| 0 | {volume: 3} | 0(或跳过) | — |
| 1 | {volume: 5} | (3) / 1 = 3 | 前 1 项(索引0) |
| 2 | {volume: 6} | (3+5) / 2 = 4 | 前 2 项(索引0-1) |
| 3 | {volume: 9} | (3+5+6) / 3 = 4.67 | 前 3 项(索引0-2) |
✅ 这正是答案函数 runningVolumeAverage 所实现的逻辑:逐项累加 volume,并在每次迭代时,用当前累计和除以当前索引 i(即已处理的前置元素个数)。
以下是推荐的生产就绪实现:
// 工具函数:生成累积平均数组(索引0处为undefined/0,索引i≥1处为前i项平均)
function runningVolumeAverage(arr) {
let sum = 0;
return arr.map(({ volume }, i) => {
sum += vol
ume;
// i === 0 时,尚未有“前置平均”概念,返回 0 或 null;此处按题设返回 0
return i === 0 ? 0 : sum / i;
});
}
// 在组件中使用
const averages = runningVolumeAverage(readings);
return (
{readings.map(({ id, date, volume }, i) => (
average: {averages[i]?.toFixed(2) ?? '—'}
))}
);⚠️ 关键注意事项:
function runningVolumeAverage(arr) {
if (!Array.isArray(arr) || arr.length === 0) return [];
let sum = 0;
return arr.map(({ volume }, i) => {
sum += volume;
return i === 0 ? 0 : sum / i;
});
}该方案时间复杂度 O(n),简洁高效,符合 React 的不可变数据流原则,可直接集成至任意列表渲染逻辑中。