从JSON取数赋值数组时遇Cannot set property 'ref' of undefined错误求助
解决“Cannot set property 'ref' of undefined”错误:正确转换JSON为对象/数组
嘿,我一眼就瞅到问题出在哪了!你这个报错是因为试图给一个还没定义的对象添加属性——你的items2初始是[[]],但循环里直接访问items2[keyScd][keyTrd]时,这个位置的元素还没被创建成对象,自然就会报错啦。另外,你代码里还有个多余操作:原JSON里的ref、prix这些字段本身就是字符串,根本不用JSON.stringify再去截引号,直接用就行!
先给你修正后的完整代码,我会逐步解释改进点:
var items2 = {}; // 初始化为空对象,更适配JSON的键值对结构 $.getJSON("results.json", function(data) { $.each(data, function(key, val) { if (key === "items") { // 先给items2创建items属性,对应原JSON的数组结构 items2.items = []; $.each(val, function(keyScd, valScd) { // 提前创建子数组,避免访问未定义元素 var subItemArray = []; $.each(valScd, function(keyTrd, valTrd) { // 直接提取需要的字段,无需冗余的JSON转换 var targetObj = { ref: valTrd.ref, prix: valTrd.prix, taille: valTrd.taille }; subItemArray.push(targetObj); }); items2.items.push(subItemArray); }); } else { // 非items的属性直接赋值给对象,比如buildNumber items2[key] = val; } }); });
关键改进点:
- 初始化结构合理:把
items2初始化为空对象,既能存储buildNumber这类键值对,也能方便创建items数组存储嵌套数据 - 提前创建嵌套元素:循环子数组时先创建空数组,再把整理好的对象push进去,彻底避免访问未定义元素的问题
- 移除冗余操作:直接使用
valTrd.ref这类原始值,原JSON里的字段本来就是字符串,JSON.stringify完全是多此一举 - 结构更直观:处理后的
items2和原JSON结构对应,后续使用起来更顺手
最终效果验证:
处理完成后,items2的结构会和你预期一致:
{ "items": [ [ { "ref": "cpe-zfmmpx23", "prix": "300", "taille": "standard" }, { "ref": "cpe-zfmmpx23", "prix": "400", "taille": "0.5mH,2mW" } ] ], "buildNumber": "fa36b5153f33240a111e6dc336a70" }
再也不会出现undefined的错误啦!
内容的提问来源于stack exchange,提问作者Med yacine
相关产品推荐
相关产品推荐

