【问题标题】:JavaScript recursive loop to sum all integers from nested arrayJavaScript递归循环对嵌套数组中的所有整数求和
【发布时间】:2015-06-12 14:35:12
【问题描述】:

arr 将是一个数组,包含整数、字符串和/或类似自身的数组。将您找到的所有整数求和,在数组嵌套中的任何位置。

这是我想出来的,但仍然不正确

function arraySum(arr) {
  var sum = 0;
  var sum1 = 0;

  for (var i = 0; i < arr.length; i++) {
    if (arr[i] === Math.round(arr[i])) { //check if its an integar
      sum += arr[i];
    }  
    if (arr[i] instanceof Array) {
      for (var n = 0; n < arr[i].length; n++) {
        sum1 += arr[i][n];
      }
    }
  }
  console.log(sum + sum1);
}

var sumArr = [[[[[[[[[1]]]]]]]], 1]; // => 101. SHOULD BE 2
arraySum(sumArr);

【问题讨论】:

  • 展平比求和更简单(都是单行运算),而且由于加法是关联和交流的,所以答案是一样的。
  • [[[[[[[[[1]]]]]]]], 1].toString().match(/[\d\.]+/g).map(Number).reduce(function(a,b){return a+b; })
  • 我可能是错的,但我觉得你可能会从改变中受益:'if (arr[i] === Math.round(arr[i])) { //检查它是否integer ' to 'if(arr[i] === math.round(arr[i]) && isNaN(arr[i]) === false) { //检查它是否是一个整数并且是一个数字。 '
  • 递归意味着函数调用自身。与其尝试对数组求和(可能还有更多嵌套数组),不如将数组传递给arraySum,并将返回值添加到求和中。

标签: javascript for-loop recursion


【解决方案1】:

如何递归使用reduce

function arrSum(arr) {
    return arr.reduce(function fn(a, b) {
        if (Array.isArray(b)) {
            return b.reduce(fn, a);
        } else if (b === Math.round(b)) {
            return a + b;
        } 

        return a;
    }, 0);
}

reduce() 方法对累加器应用一个函数,每个 数组的值(从左到右)必须将其减少为单个 价值。

【讨论】:

【解决方案2】:
function add(array){
  return(array+"").match(/-?\d+(?:\.\d+)?/g).reduce(function(a,b) {
    return +a+ +b;
  });
}

这使用正则表达式来解析字符串化数组,但它应该可以正常工作。 那么就会有一个只有数字的数组。那些被解析成 .reduce() 并添加它们。我能想到的最好的:) 帮助来自:mdn

function add(n){return JSON.stringify(n).match(/[^\D]+/g).reduce(function(n,r){return 1*n+1*r})} 是由http://jscompress.com 产生的

速度:0.04395800351630896s 要么比其他答案快 11%,要么我的数学很糟糕

更受支持的答案:

function add (array) {
    var nums = JSON.stringify(array).match(/[\d\-]+/g),
        i,
        sum = 0;
    for (i = 0; i < nums.length; i += 1) {
        sum += parseInt(nums[i], 10);
    }

    return sum;
}

【讨论】:

  • 从编辑来看,我认为您的意思是 i 能想到的最好的 ;)
  • @dandavis 哦。哇,我使用了 mdn,这是我在快速谷歌搜索后发现的。更新以显示
  • 因为我们要使用 oneliners 替换 return parseInt(a,10) + parseInt(b,10);return a*1 +b*1; 以进一步缩短它..
  • return +a + +b进一步缩短
  • @user2734550 如果你要多次使用这个功能(超过十个)我会推荐一个快速的解决方案(这个); )
【解决方案3】:
function arraySum(arr) {
  var sum = 0;
  for (var i = 0; i < arr.length; i++) {
     if (arr[i] instanceof Array) { sum += arraySum(arr[i]);}
     if (arr[i] === Math.round(arr[i])) {sum += arr[i];}   
  }
 return sum;
}

【讨论】:

    【解决方案4】:

    你可以使用递归函数来解决这个问题,试试这样的:

    function arraySum(arr) {
    var sum = 0;
    
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] === Math.round(arr[i])) { 
            sum += arr[i];
        }  
        if (arr[i] instanceof Array) {
            sum += arraySum(arr[i]); //This will apply the same function to the current Array element which is an Array
        }
    }
    return sum; //To have the sum of the actual Array
    }
        var sumArr = [[[[[[[[[1]]]]]]]], 1];
    
    console.log(arraySum(sumArr)); //now it returns 2
    

    【讨论】:

    • 这很好。仅,由于严格的相等性检查,对于字符串(例如 "5")的整数检查将失败。
    • @levi 你是对的,但由于指令是“将你找到的所有整数相加”,我认为这没有必要。
    【解决方案5】:

    试试这个:

    function arraySum(arr) {
        return arr.reduce(function(s, n) {
            return s + ((n instanceof Array) ? arraySum(n) : +n || 0);
        }, 0);
    }
    

    +n 尝试将字符串转换为整数,如果+n 产生NaN,则默认为零。

    http://jsfiddle.net/3z7pakfx/

    【讨论】:

    • 好,它只是在数字字符串上失败,例如'1'。
    • 是的,我也是——所以,它应该像这样工作(将字符串转换为整数)?
    【解决方案6】:

    这是一个不依赖迭代的解决方案:

    var arraySum = function(array) {
      if (array.length === 0) {
        return 0;
      }
      var rest = array.slice();
      var next = rest.pop();
      if (next instanceof Array) {
        return arraySum(next) + arraySum(rest);
      } else {
        return next + arraySum(rest);
      }
    };
    

    【讨论】:

      【解决方案7】:

      任何值vmore的总和是-

      1. 如果我们没有值,v,则返回空和,0
      2. 通过归纳,我们有一个值,v。如果值是一个数组,则返回v 的总和加上more 的总和
      3. 通过归纳,我们有一个值v,它不是一个数组。返回v的数值加上more的总和

      const sum = ([ v, ...more ]) =>
        v === undefined
          ? 0                   // 1
      : Array.isArray(v)
          ? sum(v) + sum(more)  // 2
      : Number(v) + sum(more)   // 3
      
      const result =
        sum([[[[[[[[[1]]]]]]]], 1])
      
      console.log(result)
      // 2

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-25
        • 1970-01-01
        • 1970-01-01
        • 2022-12-08
        • 2021-05-19
        • 2018-11-11
        • 2013-12-13
        相关资源
        最近更新 更多