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

从深度嵌套数组对象提取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 06:21:37