使用reduce方法转换数组遇问题,寻求技术指导
使用reduce实现数组转换的解决方案
直接上可行的代码实现:
const inputArr = [0, 1, 0, 1, 0, 0, 1, 0]; const transformedArr = inputArr.reduce((acc, curr) => { if (curr === 1) { acc.counter += 1; acc.result.push(acc.counter); } else { acc.result.push(0); } return acc; }, { counter: 0, result: [] }).result; console.log(transformedArr); // 输出: [0, 1, 0, 2, 0, 0, 3, 0]
代码解释
- 用reduce的初始值维护一个状态对象,包含两个属性:
counter用来累计原数组中非0元素的出现次数,result用来存储转换后的结果数组。 - 遍历原数组时:
- 遇到值为1的元素,先把
counter加1,再将更新后的counter推入结果数组; - 遇到值为0的元素,直接将0推入结果数组,不改变
counter。
- 遇到值为1的元素,先把
- 最后从reduce返回的状态对象中取出
result属性,就是目标数组。
关于需求表述的说明
从你的输入输出示例来看,实际需求应该是原数组中的非0元素(此处为1)替换为到当前位置为止的累计出现次数,0元素保持不变,和你描述的“0元素转换为前置元素与当前元素的和”不符,推测是表述偏差,上述代码是按照你给出的输入输出示例实现的正确逻辑。
内容的提问来源于stack exchange,提问作者N1c0
相关产品推荐
相关产品推荐

