使用array reduce处理含C/D/+操作的数组时D失效,求正确实现
解决数组操作挑战中的reduce实现问题
问题根源
你代码里的问题主要有三个:
- splice参数错误:
a.splice(i-1, i-1)的第二个参数是删除的元素数量,不是结束索引。这里你想删除前一个元素,应该写a.splice(i-1, 1),但即便改对了,下面的问题依然存在。 - 修改原数组打乱reduce迭代:reduce在迭代原数组时,如果你直接修改原数组(比如splice),会改变数组的长度和元素索引,导致后续元素被跳过——这就是为什么'D'的console.log没触发的原因。
- 累加器逻辑错误:你的累加器直接把数值相加,没有处理'C'/'D'/'+'这些操作符对应的逻辑,完全不符合需求里的操作规则。
正确实现思路
这个需求的操作都是基于"前一个/前两个元素",用栈结构来维护中间结果最适合。我们可以把reduce的累加器设为一个数组(栈),遍历每个元素时根据类型做对应操作,最后计算栈内元素的总和。
正确代码
const arr = [5,10,15,'C','D', '+']; // 用reduce维护一个栈,最后计算总和 const result = arr.reduce((stack, current) => { switch(current) { case 'C': // 删除前一个元素,弹出栈顶 stack.pop(); break; case 'D': // 前一个元素翻倍后入栈 stack.push(stack[stack.length - 1] * 2); break; case '+': // 前两个元素求和后入栈 const last = stack.pop(); const secondLast = stack.pop(); const sum = last + secondLast; stack.push(secondLast); stack.push(last); stack.push(sum); break; default: // 数字直接入栈 stack.push(Number(current)); } return stack; }, []).reduce((total, num) => total + num, 0); console.log(result); // 输出30
代码解释
- 第一个reduce用来处理所有操作,维护一个栈:
- 遇到数字,转成Number后推入栈;
- 'C':弹出栈顶元素(对应删除前一个元素);
- 'D':取栈顶元素翻倍,把结果推入栈;
- '+':取出栈顶两个元素求和,先把这两个元素放回栈,再把和推入栈(这样后续操作能正确获取前两个元素,也符合需求里数组的变化过程);
- 最后用第二个reduce计算栈内所有元素的总和,得到最终结果。
内容的提问来源于stack exchange,提问作者3gwebtrain
相关产品推荐
相关产品推荐

