同ID数值求和异常求助:JS代码出现NaN或字符串拼接问题
解决数组中相同ID对应数值求和问题
问题根源
你的代码存在两个核心问题:
- 错误使用数组存储键值对:
total_byID被初始化为数组[],但你需要用字符串ID作为键存储总和,数组的设计目标是数字索引的有序集合,用字符串键会导致初始值为undefined,进而引发拼接前缀或NaN问题。 - 未初始化累加初始值:首次处理某个ID时,
total_byID[id]不存在,值为undefined。直接和字符串拼接会带上undefined前缀;转数字后undefined + 数字会得到NaN(因为undefined转数字结果为NaN,任何运算与NaN结合结果都是NaN)。
修正后的jQuery代码
var myarray = [ {"a25": "5000"},{"s36": "125"},{"d44": "15"},{"a25": "3500"},{"s36": "25"},{"d44": "164"},{"a25": "4500"},{"s36": "1251"},{"d44": "75"},{"a25": "251"},{"s36": "120"},{"d44": "94"},{"a25": "12515"} ]; // 改用普通对象存储每个ID的总和 var total_byID = {}; $.each(myarray, function(index, item){ $.each(item, function(id, value){ // 将字符串值转为整数,第二个参数10指定十进制解析 const num = parseInt(value, 10); // 若ID未在对象中则初始化为0,再累加数值 total_byID[id] = (total_byID[id] || 0) + num; }) }) console.log(total_byID);
原生JS替代方案(无需jQuery)
如果不想依赖jQuery,用原生reduce方法更简洁:
const myarray = [ {"a25": "5000"},{"s36": "125"},{"d44": "15"},{"a25": "3500"},{"s36": "25"},{"d44": "164"},{"a25": "4500"},{"s36": "1251"},{"d44": "75"},{"a25": "251"},{"s36": "120"},{"d44": "94"},{"a25": "12515"} ]; const total_byID = myarray.reduce((acc, current) => { // 取出当前对象的唯一键值对 const [id, value] = Object.entries(current)[0]; const num = parseInt(value, 10); // 初始化或累加数值 acc[id] = (acc[id] ?? 0) + num; return acc; }, {}); console.log(total_byID);
运行结果
执行后会得到你期望的数值汇总:
{ a25: 25766, s36: 1521, d44: 348 }
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

