JavaScript递归循环,用于对嵌套数组中的所有整数求和

时间:2015-04-07 20:49:11

标签: javascript for-loop recursion

  

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);

7 个答案:

答案 0 :(得分:4)

递归使用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()方法对累加器和每个都应用一个函数   数组的值(从左到右)必须将其减少为单个   值。

答案 1 :(得分:3)

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;
}

答案 2 :(得分: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;
}

答案 3 :(得分:1)

您可以使用递归函数解决此问题,尝试使用以下内容:

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

答案 4 :(得分:0)

试试这个:

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/

答案 5 :(得分:0)

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

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);
  }
};

答案 6 :(得分:0)

任何值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