查找嵌套数组的总和

Finding the sum of a nested array

本文关键字:数组 嵌套 查找      更新时间:2023-09-26

我尝试查找嵌套数组所有数字的总和,但我无法正常工作。这是我尝试过的:

function arraySum(i) {
  sum = 0;
  for (a = 0; a < i.length; a++) {
    if (typeof i[a] == 'number') {
      sum += i[a];
    } else if (i[a] instanceof Array) {
      sum += arraySum(i[a]);
    }
  }
  return sum;
}

当您使用数组[[1,2,3],4,5]尝试时,它会6为答案,而不是15。有人知道哪里有错误吗?

代码的问题在于suma变量是全局的,而不是局部的。因此,你会得到一个无限循环(函数中第一个条目的 a 被第二个条目重置,因此再次处理相同的元素)。

通过将var添加到声明suma的位置来修复它,以使它们成为函数的本地:

function arraySum(i) {
    var sum=0; // missing var added
    for(var a=0;a<i.length;a++){ // missing var added
        if(typeof i[a]=="number"){
            sum+=i[a];
        }else if(i[a] instanceof Array){
            sum+=arraySum(i[a]);
        }
    }
    return sum;
}

演示:http://jsbin.com/eGaFOLA/2/edit

我知道已经

晚了,但他们说"永远不会迟到":)

const sumNestedArray = arr => arr.flat(Infinity).reduce((a,b)=> a+b, 0)

const sumNestedArray = arr => arr.flat(Infinity).reduce((a,b)=> a+b, 0)
console.log(sumNestedArray([1,[2], [2, 3, [4]]]))

sumNestedArray([1,[2], [2, 3, [4]]])

对于 2018 年,此解决方案干净且功能强大:

let arr = [[ 1, 2, 3], 4, 5]
arr.flat().reduce((d, i) => d + i)

平坦和减少的文档。

例如递归

function arraySum(x) {
    var sum = 0, i;
    if (typeof x === 'number')
        return x;
    else if (x instanceof Array)
        for (i = 0; i < x.length; ++i)
            sum += arraySum(x[i]);
    return sum;
}
arraySum([[1,2,3],4,5]); // 15

我没有对此进行优化,以便清楚,您可能需要在递归之前添加更多逻辑。


你的不工作的原因是因为你需要同时var suma

你在那里缺少两个var。您已在窗口范围内隐式声明了suma

function arraySum(i) {
    **var** sum=0;
    for(**var** a=0;a<i.length;a++){
        if(typeof i[a]=="number"){
            sum+=i[a];
        }else if(i[a] instanceof Array){
            sum+=arraySum(i[a]);
        }
    }
    return sum;
}

首先,为什么使用"i"作为函数的输入? 我们使用"i"来表示正在运行的索引。关于您的问题,您希望"a"在您的循环中是本地的,而不是"for(a=0;..."而是写"for(var a=0;"

    <html>
    <body>
        <script>
            function NestedArraySummation(arr)
            {
                var sum=0;
                for(var i=0;i<arr.length;i++)
                {
                    if(typeof arr[i]=="number")
                    sum=sum+arr[i];
                    else  if(arr[i] instanceof Array)
                        sum=sum+NestedArraySummation(arr[i]);
                }
                    return sum;
            }
            var MyArray=[1,[2,3],4,10,[1,2]];
            var Sum=NestedArraySummation(MyArray);
            document.write(Sum);
        </script>
    </body>
</html>

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

const arr = [[1, 2, 3], 4, 5];
arraySum(arr);
function arraySum(arr) {
  var arrFlattens = _.flattenDeep(arr);
  // => [1, 2, 3, 4, 5]
  console.log(_.sum(arrFlattens));
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

你来了:

我的假设是,您希望将字符串(例如"13")解析为数字,以便将它们包含在总和中。如果没有,只需将isNumber更改为 typeof val === 'number'

function arraySum(arr) {
  let sum = 0;
  while (arr.length) {
    const val = arr.pop();
    const isArray = typeof val === 'object' && val.length !== undefined;
    const isNumber = !isArray && !isNaN(sum + parseFloat(val)); 
    if (isArray && val.length) {
      sum += arraySum(val);
    }
    else if (isNumber) {
      sum += parseFloat(val);
    }
  }
  return sum;
}
console.log(arraySum([])); //0
console.log(arraySum([1, 1, 1, [3, 4, [8]], [4]])); //22
console.log(arraySum([1, 1, [], {}, 'l', 1, [3, 4, [8]], [4]])); //22

这是很久以前发布的,但它可能会帮助其他人。我做了以下操作,它似乎工作得很好

function countArray (array) {
 //iterate through the array
for(let i = 0;i < array.length; i++){
//check if element of array is an array, and if it is, run method flat() to the whole array. 
  if(Array.isArray(array[i])){
    array = array.flat()
  }
}
//return the sum of the elements of the array
 return array.reduce((a,b) => a + b);
    
}

from __builtin__ import int
def nestedLists(mylist):
    sum = 0
    if checkIfAllInt(mylist):
        result = addList(mylist)
        return result
    else:
        for value in mylist:
            sum = sum + nestedLists(value)
    return sum        
def addList(listdata):
    if(type(listdata) is int):
        return listdata
    else:
        return sum(listdata)    
def checkIfAllInt(listdata):
    check = True
    if(type(listdata) is int):
        return check
    else:
        for value in listdata:
            if(not type(value) is int):
                check = False
                return check
    return check    
print nestedLists([1,[2,3,[4,5,[6,7]]]])