【问题标题】:Sum all integers in a multidimensional array javascript对多维数组javascript中的所有整数求和
【发布时间】:2016-02-13 09:51:11
【问题描述】:

假设我有这个:

function arrSum(){
  *code here*
}

如何编写 arrSum 函数,以便它可以对多维数组(可变深度)中的所有整数求和。

arrSum([2, 5, [4, 6], 5]) === 22;

我知道在某个地方一定有答案,但我真的找不到。如果这是重复的,请告诉我。

【问题讨论】:

标签: javascript arrays loops multidimensional-array sum


【解决方案1】:

你可以简单地用递归编写这样的函数

function arrSum(arr) {
  var sum = 0;
  // iterate array using forEach, better to use for loop since it have higher performance
  arr.forEach(function(v) {
    // checking array element is an array
    if (typeof v == 'object')
      // if array then getting sum it's element (recursion)
      sum += arrSum(v);
    else
      // else adding the value with sum
      sum += v
  })
  // returning the result
  return sum;
}

console.log(arrSum([2, 5, [4, 6], 5]) === 22);

使用for循环

function arrSum(arr) {
  var sum = 0;
  for (var i = 0; i < arr.length; i++) {
    if (typeof arr[i] == 'object')
      sum += arrSum(arr[i]);
    else
      sum += arr[i];
  }
  return sum;
}

console.log(arrSum([2, 5, [4, 6], 5]) === 22);

【讨论】:

  • 这很好用 - 谢谢。我可以问一下 - 你为什么要测试 typeof 对象?
  • @VoA : 检查内部元素是arraynumber, developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 我只需将 isObject 检查移到 foreach 之前,这样,发送单个数字,它仍然可以工作。
  • 在您的 for 循环答案中,您写道:“sum += arrSum(arr[i]);”。你能解释一下这是做什么的吗?它是从自身内部调用 arrSum 函数吗?
  • @VoA :使用内部数组(递归)调用相同的函数,并使用sum变量添加返回值
【解决方案2】:

检查一下:

function arrSum(objArr){
  var total = 0;
  for(var outerLoop=0; outerLoop < objArr.length; outerLoop++){
    if(objArr[outerLoop].constructor === Array){
      for(var innerLoop=0; innerLoop < objArr[outerLoop].length; innerLoop++){
        total += objArr[outerLoop][innerLoop];
      }
    } else {
      total += objArr[outerLoop];
    }
  }
  return total;
}

alert (arrSum([2, 5, [4, 6], 5]));

【讨论】:

  • OP 表示可变数组深度。这只会深入两层。
【解决方案3】:

我将构建一个类似于 Pranav C Balan 的函数,不同之处在于我会在调用 forEach() 之前检查 isObject()
这样我就可以解决发送单个 numeric 参数或Null 值所带来的问题。

function arrSum(v) {
  // checking if element is an array
  if (typeof v == 'object') {
    var sum = 0;
    
    // iterate array using forEach, better to use for loop since it have higher performance
    v.forEach(function(e) {
      sum+=arrSum(e);
    });
    return sum;
  }
  else {
      return v;
  }
}
$('body').append($('<p></p>').html('[2, 5, [4, 6], 5] = ' + arrSum([2, 5, [4, 6], 5])));
$('body').append($('<p></p>').html('[2,, 5] = ' + arrSum([2,, 5])));
$('body').append($('<p></p>').html('5 = ' + arrSum(5)));
&lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt;/script&gt;

【讨论】:

    【解决方案4】:
        function arrSum(arr) {
            var totalSum = null;
            var numString = arr.toString();
            var numberArray = numString.split(",");
            numberArray.forEach(function(ele){
              totalSum = totalSum + parseInt(ele);
            });
            return totalSum;
        }
        console.log(arrSum([2, 5, [4, 6], 5]);
    

    【讨论】:

      【解决方案5】:

      如果我们有一个包含字符串和整数的多维数组,并且我们必须得到数字的总和,那么按照@Pranav C Balan 的解决方案,我们可以在 else 循环中添加一个检查以仅检查数字,如下所示 -

            function arrSum(arr) {
      		  var sum = 0;
      		  for (var i = 0; i < arr.length; i++) {
      			   if (typeof arr[i] == 'object'){
      			      sum += arrSum(arr[i]);
      			   }else if (Number(arr[i])){
      			      sum += arr[i];
      			   }
      		  }
      		  return sum;
      		}
      		console.log(arrSum([2, 'a', 5, [4, 6, 10, [1, 2, 'b'], 10], 5]));

      【讨论】:

        【解决方案6】:

        使用.reduce() 的更现代的方法:

        const arr = [2, 5, [4, 6], 5];
        
        const arrSum = array =>
            array.reduce(
                (sum, num) => sum + (Array.isArray(num) ? arrSum(num) : num * 1),
                0
            );
        
        console.log(arrSum(arr));

        【讨论】:

          【解决方案7】:

          这可以通过 lodash _.flattenDeep_.sum 来完成:

          var arr = [2, 5, [4, 6], 5];
          arrSum(arr);
          
          function arrSum(arr) {
            var arrFlattens = _.flattenDeep(arr);
            // => [2, 5, 4, 6, 5]
            console.log(_.sum(arrFlattens));
          }
          &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"&gt;&lt;/script&gt;

          【讨论】:

            【解决方案8】:

            为什么没有人使用flat()

            const arr = [2, 5, [4, 6], 5];
            
            const result = arr.flat().reduce((a,b) => a+b);
            
            console.log(result);

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-06-12
              • 2015-10-30
              • 1970-01-01
              • 2019-07-19
              • 1970-01-01
              • 2018-04-11
              相关资源
              最近更新 更多