如何给对象数组添加新元素?解决ReferenceError报错问题
问题原因与解决方案
你碰到的ReferenceError: name is not defined错误其实很好解决,咱们一步步拆解清楚:
错误根源
你在返回成功提示的语句里用了name和value,但这两个根本不是当前作用域里的变量!
你在创建新对象时用的是自己定义的nname和nvalue变量,而对象里的name: nname只是把nname的值赋值给新对象的name属性——这个name只是对象的属性键名,不是可以直接在代码里引用的变量。属性键名和当前代码的变量完全是两回事,你不能把对象里的属性名当成代码变量来用,除非你专门把属性值存到变量里(但你已经存了,就是nname和nvalue)。
修正后的代码
我把你的代码格式化得更易读(紧凑代码很容易藏bug),同时修正了变量名的问题,还加了点输入校验:
exports.handle = function(input) { // 查找已有命令并返回对应值 for(var i=0; i<cc.list.length; i++) { if(input === cc.list[i].name) { return cc.list[i].value; } } // 处理创建新命令的逻辑 if(input.startsWith("create-cc")) { var namevalue = input.slice(10); // slice到末尾可以省略第二个参数 var spaceloc = namevalue.indexOf(" "); // 校验输入格式:防止用户没输入空格分隔name和value if(spaceloc === -1) { return "Error: Please enter both name and value separated by a space."; } var nname = namevalue.slice(0, spaceloc); var nvalue = namevalue.slice(spaceloc+1); // 给数组添加新对象元素 cc.list.push({ name: nname, value: nvalue }); // 这里把错误的name/value换成实际定义的nname/nvalue return `Command successfully created! Typing \`Z!${nname}\` will output \`${nvalue}\` now!`; } return "Error."; };
额外优化小建议
- 用ES6模板字符串(反引号
`)拼接字符串比加号更清晰,也不容易出错 - 可以用
find方法替代for循环,让代码更简洁:const existingItem = cc.list.find(item => item.name === input); if(existingItem) { return existingItem.value; }
内容的提问来源于stack exchange,提问作者Pritt Balagopal
相关产品推荐
相关产品推荐

