Typescript数组对象更新newBalance累计值失败,求排查问题
问题分析与修正
你的代码存在两个核心问题:
1. 第一个map的逻辑错误
在for循环的每一轮,你都用map把所有数组项的newBalance设置为当前的total。这会导致循环结束后,所有项的newBalance都会被覆盖成最后一次循环的total值(也就是15),而不是每一步的累计余额。比如:
- 第一次循环后,所有项
newBalance变成10 - 第二次循环后,所有项
newBalance变成0 - 第三次循环后,所有项
newBalance变成15
2. 第二个map的无效操作
map方法会返回一个新数组,你没有把这个新数组赋值给arr,所以原数组根本不会被修改。另外你的条件判断item.newBalance != 0也不合理:初始时所有newBalance都是0,第一次循环时这个条件不成立,直接返回原对象,完全不会更新;后续循环时newBalance已经被第一个map修改过,即使返回新对象,也没赋值给原数组,等于白做。
正确实现方式
你不需要用map,直接在循环里更新当前项的newBalance即可,逻辑更简单清晰:
var arr = [ { "value": 10, "newBalance": 0 }, { "value": -10, "newBalance": 0 }, { "value": 15, "newBalance": 0 }, ]; let total = 0; for (let i = 0, l = arr.length; i < l; ++i) { total += arr[i].value; // 只更新当前项的newBalance,而非所有项 arr[i].newBalance = total; } console.log(arr); // 输出结果: // [ // { value: 10, newBalance: 10 }, // { value: -10, newBalance: 0 }, // { value: 15, newBalance: 15 } // ]
或者用forEach简化循环写法:
let total = 0; arr.forEach(item => { total += item.value; item.newBalance = total; });
这两种方式都会按顺序累计total,并把每一步的累计值赋值给对应项的newBalance,得到正确的累计余额。
内容的提问来源于stack exchange,提问作者Sami-L
相关产品推荐
相关产品推荐

