从深度嵌套数组对象提取Goals字段遇阻,求解决方案
问题分析与解决
错误原因
你遇到的i.map is not a function错误,核心问题是:
Object.keys(sort)返回的是分组对象的键名数组(比如["7", "8", "9"],对应8、9、10月,因为getMonth()返回0-11的索引),循环里的i是字符串类型的月份索引,不是数组,自然不能调用map方法。- 箭头函数写法存在问题:多余的大括号导致没有返回值,且每个访问记录的
goals本身是数组,需要嵌套一层map才能提取title。
修正方案(原生JS+Lodash结合)
方案1:修复原有代码逻辑
const sort = _.groupBy(visits, ({visitEnd}) => new Date(visitEnd).getMonth()); // 建议把月份转成更易读的格式,比如"2022-08",避免索引混淆 // 可替换成:new Date(visitEnd).toLocaleDateString('en-US', {year: 'numeric', month: '2-digit'}) const stage = Object.keys(sort).map(monthKey => { // 获取当前月份对应的所有访问记录数组 const monthVisits = sort[monthKey]; // 提取该月份下所有goals的title(平铺格式) const allGoalsTitles = monthVisits.flatMap(visit => visit.goals.map(goal => goal.title) ); // 若要保留每个访问记录对应的goals title数组,可替换为: // const goalsByVisit = monthVisits.map(visit => visit.goals.map(g => g.title)) return { month: monthKey, // 或转成"2022-08"格式 goals: allGoalsTitles }; }); console.log("sort 2: ", stage);
方案2:用Lodash mapValues简化代码
如果想直接得到「月份为键、对应goals title数组为值」的对象,用Lodash的mapValues更高效:
const groupedByMonth = _.groupBy(visits, ({visitEnd}) => new Date(visitEnd).toLocaleDateString('en-US', {year: 'numeric', month: '2-digit'}) ); const stage = _.mapValues(groupedByMonth, visits => visits.flatMap(visit => visit.goals.map(g => g.title)) ); console.log("sort 2: ", stage);
额外提示
getMonth()返回0-11的索引,直接用它当键容易混淆(比如7对应8月),建议转成YYYY-MM格式的字符串,更直观。- 如果需要去重每个月份的goals title,可添加
_.uniq(),比如_.uniq(visits.flatMap(...))。
内容的提问来源于stack exchange,提问作者Jowz
相关产品推荐
相关产品推荐

