You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用array reduce处理含C/D/+操作的数组时D失效,求正确实现

解决数组操作挑战中的reduce实现问题

问题根源

你代码里的问题主要有三个:

  1. splice参数错误:a.splice(i-1, i-1)的第二个参数是删除的元素数量,不是结束索引。这里你想删除前一个元素,应该写a.splice(i-1, 1),但即便改对了,下面的问题依然存在。
  2. 修改原数组打乱reduce迭代:reduce在迭代原数组时,如果你直接修改原数组(比如splice),会改变数组的长度和元素索引,导致后续元素被跳过——这就是为什么'D'的console.log没触发的原因。
  3. 累加器逻辑错误:你的累加器直接把数值相加,没有处理'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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 00:35:29