JavaScript对象数组操作报错:Cannot read properties of undefined
问题排查与解决:Uncaught TypeError: Cannot read properties of undefined (reading 'hasOwnProperty')
错误根源
你遇到的类型错误,核心原因是动态访问对象属性时错误使用了点语法。JavaScript中,当属性名是变量(比如函数参数id)或非标准标识符的字符串(如"5439"),必须用方括号[]访问,而非点.。你的代码里collection.id会被解析为访问collection中名为id的固定属性,而非传入的id参数对应的记录,导致collection.id为undefined,调用hasOwnProperty自然触发报错。
代码中的具体问题
- 动态属性访问错误:所有
collection.id的写法都要改成collection[id],因为id是动态参数。 - 删除属性语法错误:
delete collection.id.prop同样错误,需改为delete collection[id][prop]。 - 空值判断逻辑错误:需求是“值为空字符串则删除属性”,但你判断的是
value !== undefined,应改为value !== ""。 - tracks分支未处理空值:当
value为空字符串时,没有删除tracks属性的逻辑,不符合需求。
修正后的完整代码
var collection = { "2548": { "album": "Slippery When Wet", "artist": "Bon Jovi", "tracks": [ "Let It Rock", "You Give Love A Bad Name" ] }, "2468": { "album": "1999", "artist": "Prince", "tracks": [ "1999", "Little Red Corvette" ] }, "1245": { "artist": "Robert Palmer", "tracks": [] }, "5439": { "album": "ABBA Gold" } }; var collectionCopy = JSON.parse(JSON.stringify(collection)); function updateRecords(id, prop, value) { const record = collection[id]; if (prop === "tracks") { if (value === "") { delete record.tracks; } else { // 存在tracks则push,不存在则创建数组 record.tracks ? record.tracks.push(value) : record.tracks = [value]; } } else { if (value === "") { delete record[prop]; } else { record[prop] = value; } } return collection; } console.log(updateRecords("5439", "tracks", "Take a chance on me")); // 输出:{... "5439": {"album": "ABBA Gold", "tracks": ["Take a chance on me"]} ...}
修正逻辑说明
- 先获取目标记录
const record = collection[id],简化后续代码的属性访问。 - 处理
tracks属性:- 若
value为空字符串,直接删除该属性; - 若记录已有
tracks数组,追加值;否则创建新数组并赋值。
- 若
- 处理其他属性:
- 若
value为空字符串,删除该属性;否则更新或添加属性值。
- 若
- 返回修改后的
collection对象,符合所有需求。
内容的提问来源于stack exchange,提问作者Sean Coutinho
相关产品推荐
相关产品推荐

