本文介绍如何在 react native 中为数组每个位置计算“截至当前(不含首项)”的累积平均值,即第 i 项对应前 i 个元素(索引 0 到 i−1)的平均值,并正确绑定到列表渲染中。
在 React Native 开发中,常需对传感器读数、时间序列数据等进行实时统计处理。你提到的需求——对 readings 数组中每个元素计算“到该位置为止(不包含当前项)的平均值”,实际是一种前缀累积平均(running average excluding current),更准确地说,是:
⚠️ 注意:你原始代码中误将 id 当作数组索引(如 id == 1),但 id 是业务标识符,不可靠;应使用 map 的第二个参数 index(即 i)进行位置计算。
以下是推荐的实现方案:
const runningVolumeAverage = (arr) => {
let sum = 0;
return arr.map(({ volume }, i) => {
if (i === 0) return 0; // 首项不参与平均,返回 0(或 null/undefined)
sum += arr[i - 1].volume; // 累加「前一项」,确保当前项不计入
return parseFloat((sum / i).toFixed(2)); // 保留两位小数,提升可读性
});
};? 关键逻辑说明: sum 累加的是 arr[i-1].volume(即前 i 个元素:索引 0 到 i-1),因此 i=1 时累加 arr[0],i=2 时累加 arr[0]+arr[1]…… 分母为 i(即已累加的元素个数),自然满足“前 i 项平均”。
const averages = runningVolumeAverage(readings); return ({readings.map(({ id, date, volume }, i) => ( );))} average: {averages[i] !== 0 ? averages[i] : '—'} {/* 首项显示破折号 */}
若需支持动态更新(如新增读数后重算),可将 avera

const averages = useMemo(() => runningVolumeAverage(readings), [readings]);
这样既保证逻辑清晰、性能可控,又符合 React 的函数式与不可变数据原则。