在 react native 中,需为数组中每个元素(除首项外)计算从首项到当前项的累计平均值,并在渲染时正确显示对应值。
实现该功能的关键在于:不为每个元素单独计算“相邻差值平均”,而是计算以首个数据为起点、逐项扩展的累计平均值(running average)。根据问题描述,输入 [3, 5, 6, 9] 应得到如下结果:
⚠️ 经仔细分析原始描述与参考答案,真实意图是:
✅ 对第 i 个元素(0-indexed),计算前 i+1 个元素的和,再除以 i(即 i > 0 时用 sum / i)
→ 这等价于:跳过首项,将后续每个位置的平均值定义为“包含首项在内的前 i+1 个值的总和 ÷ 当前位置索引 i”。
例如:
这正是参考答案中 runningVolumeAverage 函数所实现的逻辑(return i && sum / i)。
// 工具函数:生成累计平均值数组(长度与输入一致,首项为 0)
const calculateRunningAverages = (arr: { volume: number }[]): (number | null)[] => {
let sum = 0;
return arr.map(({ volume }, i) => {
sum += volume;
return i === 0 ? 0 : sum / i; // 首项返回 0;其余返回 sum / 当前索引(即“前 i+1 项和 ÷ i”)
});
};
// 在组件中使用
const averages = calculateRunningAverages(readings);
return (
{readings.map(({ id, date, volume }, index) => (
average: {averages[index] !== 0 ? averages[index].toFixed(2) : '—'}
))}
);
if (arr.length === 0) return []; if (arr.length === 1) return [0];
该需求本质是「带偏移的运行平均」——以首项为基准,每新增一项就更新一次「历史总和 ÷ 当前索引」。通过预计算 averages 数组并解耦渲染逻辑,既保证性能,又提升可维护性。最终效果:每个卡片显示其所在位置对应的动态平均值,语义清晰,符合业务预期。