You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 21:24:00