You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

JavaScript中嵌套数组元素值的求和实现(使用reduce或map方法)

实现多层嵌套数组的元素求和(基于reduce/map)

嘿,这个多层嵌套数组求和的需求我太熟了!刚好可以用reduce结合递归来搞定,甚至也能搭配map实现,咱们直接上代码和思路:

核心实现(reduce递归版)

这是最直接的方式,利用reduce的累加特性,递归处理每一层嵌套数组:

function nestedSum(arr) {
  return arr.reduce((accumulator, currentItem) => {
    // 检查当前元素是不是数组,是就递归求和,否则转成数字累加
    return accumulator + (Array.isArray(currentItem) ? nestedSum(currentItem) : Number(currentItem));
  }, 0); // 初始累加值设为0,确保从0开始计算
}

// 测试你的示例数组
let exampleArray =[[[['1','2'],'3'],'4'],'5'];
console.log(nestedSum(exampleArray)); // 输出 15(1+2+3+4+5的结果)

逻辑拆解

  • reduce的回调函数里,我们对每个元素做判断:如果是数组,就递归调用nestedSum拿到子数组的总和;如果是字符串数字,就用Number()转成数值类型再累加。
  • 初始值设为0是关键,避免数组为空或者第一层就是单个元素时出现计算异常。

搭配map的实现版本

如果非要用map的话,我们可以先把所有嵌套元素“扁平化”转换为数值(子数组直接转成对应总和),再用reduce累加:

function nestedSumWithMap(arr) {
  // 先用map把每个元素处理成数值或子数组的和
  const processedItems = arr.map(item => {
    return Array.isArray(item) ? nestedSumWithMap(item) : Number(item);
  });
  // 再用reduce把所有值加起来
  return processedItems.reduce((total, num) => total + num, 0);
}

// 测试同样有效
console.log(nestedSumWithMap(exampleArray)); // 输出 15

这个版本本质和第一个思路一致,只是把“递归判断”和“累加”拆成了两步,用map先完成元素转换,再用reduce求和。

可选:容错处理

如果数组里可能存在非数字字符串(比如'abc'),可以加个容错判断,避免结果变成NaN

function safeNestedSum(arr) {
  return arr.reduce((total, currentItem) => {
    if (Array.isArray(currentItem)) {
      return total + safeNestedSum(currentItem);
    }
    const numValue = Number(currentItem);
    // 如果转不成有效数字,就加0(也可以改成抛出错误提示)
    return total + (isNaN(numValue) ? 0 : numValue);
  }, 0);
}

内容的提问来源于stack exchange,提问作者Satyajit Ghosh

火山引擎 最新活动