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

JavaScript遍历嵌套数组 求ps_lessons.lesson_length_minutes总和

嵌套数组指定字段求和实现方案

需求说明

需要遍历如下结构的JavaScript嵌套数组,累加所有二级数组ps_lessons下的lesson_length_minutes字段值,预期输出结果为118(即20 + 22 + 33 + 43的和):

[
    {
        "sort_id": 1,
        "category": "Introduction",
        "ps_lessons": [
            {
                "id": "48ca672b-aaca-473c-b54b-3cf699da848b",
                "sort_id": 1,
                "lesson_title": "Welcome to the course",
                "lesson_length_minutes": 20
            },
            {
                "id": "3f0f5715-a442-4262-ad32-6fb653df62c2",
                "sort_id": 2,
                "lesson_title": "What is React JS?",
                "lesson_length_minutes": 22
            }
        ]
    },
    {
        "sort_id": 2,
        "category": "Fundamentals",
        "ps_lessons": [
            {
                "id": "e28abd67-29a4-4bc9-a415-fb5db0aabfa9",
                "sort_id": 4,
                "lesson_title": "Fundamentals of React JS",
                "lesson_length_minutes": 33
            },
            {
                "id": "1d9668da-94e6-4085-bd89-176cc4e8e62d",
                "sort_id": 3,
                "lesson_title": "Fundamentals of JSX",
                "lesson_length_minutes": 43
            }
        ]
    }
]

原代码问题

原实现尝试通过两次调用map方法完成需求,但代码运行异常,问题点如下:

  • 语法错误:箭头函数回调内部包含多行语句时,必须用大括号{}包裹函数体,原代码第一层map回调直接声明变量未包裹大括号,直接触发语法报错
  • 变量作用域错误:sum变量定义在第一层map的回调内部,每次遍历主数组元素时都会重置为0,无法正确累加全局总和
  • 语义不符:map方法的设计用途是遍历数组并返回映射后的新数组,做累加求和场景下使用reduce语义更匹配,也不会生成无用的临时数组
  • 缺少返回值:函数执行完成后没有返回计算得到的总和,外部无法获取计算结果

原错误代码如下:

const extract_mins_and_sum = (result) => {
  console.log('result', result);
     result.map((single_row) =>
      let sum = 0;
        single_row.ps_lessons.map((single_row_lesson) =>
    
         ( console.log(single_row_lesson.lesson_length_minutes);
          sum += single_row_lesson.lesson_length_minutes)
        )
      );
    };

正确实现

推荐写法(简洁语义化)

用flatMap把所有二级课程拍平成一维数组,再用reduce做累加,代码简洁易读:

const extract_mins_and_sum = (result) => {
  return result
    .flatMap(single_row => single_row.ps_lessons)
    .reduce((total, lesson) => total + lesson.lesson_length_minutes, 0)
}

// 调用示例
// const totalMinutes = extract_mins_and_sum(源数据数组)
// console.log(totalMinutes) // 输出118

兼容旧环境写法

如果运行环境不支持flatMap,可以嵌套两层reduce实现:

const extract_mins_and_sum = (result) => {
  return result.reduce((total, single_row) => {
    const categoryMinutes = single_row.ps_lessons.reduce((catTotal, lesson) => {
      return catTotal + lesson.lesson_length_minutes
    }, 0)
    return total + categoryMinutes
  }, 0)
}

原map思路修正版

如果要沿用原来的map遍历思路,仅修正语法和逻辑错误:

const extract_mins_and_sum = (result) => {
  let sum = 0; // 总和变量定义在循环外层
  result.map((single_row) => { // 多行回调补全大括号
    single_row.ps_lessons.map((single_row_lesson) => {
      sum += single_row_lesson.lesson_length_minutes
    })
  });
  return sum; // 返回最终计算结果
}

提示:上面的map修正版仅做语法逻辑纠错用,实际开发优先选择reduce实现,避免不必要的内存开销。

内容的提问来源于stack exchange,提问作者Venkata Penumatsa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 21:30:42