Angular中map内循环访问对象键报Cannot read property '0'如何解决
问题原因
你的报错核心是JS对象属性访问语法用错了:
当你写 xxx.reportFieldsArr[index] 时,JS会尝试读取xxx对象上名为reportFieldsArr的属性,再取这个属性的第index位。而你的lead对象上根本没有reportFieldsArr这个属性,读取结果为undefined,再调用[0]就会触发Cannot read property '0' of undefined报错。
你需要的是从传入的reportFieldsArr数组里取出对应index的键名,再用这个键名读取lead对象的对应属性,这种动态属性访问场景必须使用方括号语法。
修复后代码
额外优化:不要在for循环里重复调用leads.find,同一个id只需要查询一次,既提升性能也能避免偶发的查找异常。
filterLeads(leads, reportFieldsArr){ this.leads = Array.from(new Set(leads.map(s => s.personId))) .map(id => { // 同一个id先找到对应的lead对象,仅查询一次 const currentLead = leads.find(s => s.personId === id); // 如果你需要和静态代码一致返回带键名的对象,用下面的写法 let leadFields = {}; // 如果你需要返回值的数组,就改为 let leadFields = [] for(let index = 0; index < reportFieldsArr.length; index++){ const key = reportFieldsArr[index]; // 方括号动态读取对象属性 leadFields[key] = currentLead[key]; // 如果要返回数组,改为 leadFields[index] = currentLead[key] } return leadFields; }); }
补充说明
- 点操作符只能访问固定名称的属性,当属性名是变量/动态生成时,必须使用
对象[变量名]的写法 - 原代码重复调用find会导致同一个id在leads数组中扫描N次(N等于reportFieldsArr的长度),数据量大时性能损耗非常明显,提前缓存当前查询到的lead更合理
内容的提问来源于stack exchange,提问作者Rinzler21
相关产品推荐
相关产品推荐

