从推入数组的对象中获取最后一个键时遇TypeError问题排查
问题排查与修复
错误原因分析
- 空栈访问错误:第一次循环时
stack是空数组,stack[stack.length-1]返回undefined,此时尝试读取undefined[0]直接触发Cannot read properties of undefined (reading '0')错误。 - 语法无效代码:原代码中有一行孤立的
[Object.values(newObj).length-1]),属于无意义的语法错误,会导致代码解析失败。 - 对象引用污染:共用外部的
newObj,栈中存储的是对象引用,后续修改newObj会影响栈内所有已存入的对象,无法独立跟踪每个连续字符的计数。 - 逻辑设计偏差:栈结构没有关联字符与连续出现次数,无法实现移除k个连续重复字符的核心需求。
修复后的代码实现
调整栈的存储结构,让每个栈元素独立存储字符和连续计数,同时修正错误逻辑:
var remove = function(s, k) { let stack = []; for(const char of s){ const top = stack[stack.length - 1]; // 打印栈顶字符(栈非空时) console.log(`stack: ${top ? top.char : '空'}`); if(top && top.char === char){ top.count++; // 计数达到k时弹出栈顶 if(top.count === k){ stack.pop(); } } else { stack.push({char, count: 1}); } } // 可返回处理后的结果字符串 return stack.map(item => item.char.repeat(item.count)).join(''); }; // 测试调用 const s = "deeedbbcccbdaa"; const k = 3; remove(s, k);
修复说明
- 规避空栈访问:先判断栈是否有元素,再读取栈顶字符,避免undefined访问错误。
- 独立计数跟踪:每个栈元素是独立的
{char, count}对象,不会互相干扰,准确记录连续字符的出现次数。 - 修正核心逻辑:当连续计数达到k时弹出栈顶,符合移除k个连续重复字符的需求,同时正确打印栈顶字符。
- 清除无效代码:删除原代码中多余的语法错误行。
内容的提问来源于stack exchange,提问作者Emm
相关产品推荐
相关产品推荐

