如何对数组指定索引原有值求和后使用splice方法替换,适配Chart.js月度统计场景
问题修复方案
问题根因
- 索引错位:
monthInNumber是1~12的月份数值,你取值时用result[j]取和月份数值相同的索引,但赋值时用splice(j-1, 1, xxx)放到前一位索引,导致每次取值都是未更新的初始值,无法实现累加 - 数组初始化长度错误:12个月份需要对应12个数组元素,你初始化的
result只有11个'0',12月对应索引会越界 - 内层循环冗余:j从0到12的循环没有实际作用,直接通过月份计算索引即可
- 变量未声明:
totalAmount没有用let/const声明,存在全局变量污染风险
修复后完整代码
// 初始化12个元素对应12个月份 var result = ['0','0','0','0','0','0','0','0','0','0','0','0']; const allMonth = ["Jan", "Feb", "Mar", 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] $(document).ready(function(){ $.ajax({ type: 'GET', url: "/sales-overview/", success: function(data) { for( var i = 0; i< data.length; i++) { let transactionMonth = data[i].createdAt // 把月份字符串转成数字,得到1~12的数值 let monthInNumber = Number(transactionMonth.slice(5, 7)) // 直接计算对应数组索引,1月对应索引0,12月对应索引11 let arrIndex = monthInNumber - 1 // 累加计算,取值和赋值使用同一个索引 let totalAmount = Number(result[arrIndex]) + Number(data[i].cartTotal); // 替换对应位置的值,保持字符串类型和初始值保持一致 result.splice(arrIndex, 1, totalAmount.toString()); } // 此处可插入Chart.js渲染逻辑 }, error: function(err) { console.log(err) } }) })
改动说明
- 调整
result数组初始长度为12,覆盖全年12个月的索引范围 - 删除冗余的内层j循环,直接通过月份数值计算对应数组索引,彻底避免索引错位问题
- 取值和赋值使用同一个索引,保证每次累加的是上一次更新后的值,解决无法累加的问题
- 补充变量声明,避免全局污染
内容的提问来源于stack exchange,提问作者xetryDcoder
相关产品推荐
相关产品推荐

