You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React组件中reduce计算endX首次为0后续出现NaN问题求助

解决addWidget方法中endX计算出现NaN的问题

咱们直接来看问题所在:你的reduce累加逻辑写错了,这才导致后续计算出现NaN。

问题根源

你当前的reduce代码是:

let endX = this.state.widgets.reduce((endX, w) => endX.w + w.w, 0)

这里你给reduce传了初始值0,意味着第一次执行回调时,endX是数字0,而非widget对象。数字没有w属性,所以endX.w会返回undefined,undefined和w.w相加的结果就是NaN——一旦出现NaN,后续所有基于它的计算都会保持NaN状态。

修正方案

把reduce的累加逻辑改成直接累加宽度数值,去掉对不存在属性的访问:

addWidget = (index) => { 
  // 累加所有已存在widget的宽度总和
  let endX = this.state.widgets.reduce((totalWidth, widget) => totalWidth + widget.w, 0) 
  console.log(endX); 
  if (endX === 12) endX = 0 
  this.setState({ 
    widgets: this.state.widgets.concat({ 
      ...this.state.availableWidgets[index], 
      i: uuid(), 
      x: endX, 
      y: Infinity, 
    }) 
  }) 
}

为什么这样能解决问题

  • 初始值0是数字类型,回调里的totalWidth始终是累加后的宽度总和(数字)
  • 每次循环只需要把当前widget的w属性值加到totalWidth上即可
  • 当widgets为空数组时,reduce直接返回初始值0,符合你的预期;当有widget时,会正确累加所有宽度

我还给变量和参数改了更语义化的名字(totalWidth、widget),这样能更直观地理解代码逻辑,减少类似的错误~

内容的提问来源于stack exchange,提问作者Aessandro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:52:23