JavaScript链表转数组:原函数报ReferenceError,求迭代rest或重写方案
链表转数组函数的错误修复方案
错误原因分析
rest未定义报错:你在else if分支里直接使用了rest变量,但这个变量从未声明过,实际要访问的是当前链表节点的rest属性,应该用list.rest或者list[property]来获取。- 逻辑错误:原函数往数组里push的是字符串
"value",而不是节点实际的value值(比如10、20),完全不符合需求。 - 遍历方式错误:用
for...in遍历对象属性的思路不适合处理链表结构,链表是通过rest层层嵌套指向后续节点的,需要逐个遍历每个节点直到rest为null。
正确实现方式
方式一:循环迭代(推荐,避免递归深度限制)
const list = {"value":10,"rest":{"value":20,"rest":null}}; function list_to_array(list) { const arr = []; let currentNode = list; // 循环遍历每个节点,直到当前节点为null while (currentNode) { arr.push(currentNode.value); // 移动到下一个节点 currentNode = currentNode.rest; } return arr; // 必须返回数组,原函数遗漏了这一步 } console.log(JSON.stringify(list_to_array(list))); // 输出 "[10,20]"
方式二:递归实现(代码简洁,适合短链表)
const list = {"value":10,"rest":{"value":20,"rest":null}}; function list_to_array(list) { // 当前节点为空时返回空数组 if (!list) return []; // 拼接当前节点的value和后续节点转换的数组 return [list.value, ...list_to_array(list.rest)]; } console.log(JSON.stringify(list_to_array(list))); // 输出 "[10,20]"
额外注意点
- 原函数里的
arr没有用const/let声明,会变成全局变量,必须加上声明避免污染全局作用域。 - 原函数调用时用了
list_to_array(x),但定义的链表变量是list,要改成list_to_array(list)才正确。
内容的提问来源于stack exchange,提问作者VOZ ESTOICA
相关产品推荐
相关产品推荐

