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

React中如何对map返回的投票数值求和?解决字符串拼接问题

解决投票数相加变成字符串拼接的问题

嘿,我懂你遇到的这个坑——这大概率是因为你的item.votes是字符串类型而非数字类型,直接循环相加时触发了字符串拼接,才会得到5000这种奇怪的结果。下面给你几个实用的解决办法:

方法1:用reduce快速求和(最推荐)

Array.reduce()是处理数组求和的绝佳工具,还能顺便把字符串转成数字,一步到位:

getTotalUserVotes = (userid) => { 
  let posts = this.state.posts.slice(); 
  let current = posts.filter(item => item.userid === userid); 
  console.log(current); 
  // 直接在reduce里完成转数字+求和
  const totalVotes = current.reduce((sum, item) => {
    return sum + Number(item.votes);
  }, 0); // 初始值设为0,确保是数值类型
  return <div>votes: {totalVotes}</div>; 
}

方法2:修改for循环,手动转数字

如果你更习惯用for循环,只需要把每个投票数转成数字再相加就行:

getTotalUserVotes = (userid) => { 
  let posts = this.state.posts.slice(); 
  let current = posts.filter(item => item.userid === userid); 
  console.log(current); 
  const tot = current.map(item => item.votes); 
  console.log("tot is " + tot); 
  
  let totalVotes = 0;
  for (let vote of tot) {
    // 用Number()、parseInt()或者parseFloat()转成数字都可以
    totalVotes += Number(vote);
  }
  
  return <div>votes: {totalVotes}</div>; 
}

方法3:先把所有投票数转成数字再处理

也可以在map阶段就把字符串转成数字,这样后续的求和操作就不会踩坑:

getTotalUserVotes = (userid) => { 
  let posts = this.state.posts.slice(); 
  let current = posts.filter(item => item.userid === userid); 
  console.log(current); 
  // map的时候直接转成数字
  const tot = current.map(item => Number(item.votes)); 
  console.log("tot is " + tot); 
  
  // 现在用循环或者reduce都能正常求和了
  const totalVotes = tot.reduce((sum, vote) => sum + vote, 0);
  
  return <div>votes: {totalVotes}</div>; 
}

问题根源说明

当item.votes是字符串(比如从后端接口返回的是字符串格式的数字,或者在state里存储时没转成数字),JavaScript的+运算符会优先执行字符串拼接而非数值加法。比如0 + "50"会得到"50",接着"50" + "0"得到"500",最后"500" + "0"就变成了"5000"。只要把每个值转成数字,就能触发正常的数值加法啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:45:26