3

我试图找到一个嵌套数组的所有数字的总和,但我没有让它正常工作。这是我尝试过的:

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

当您使用 array 进行尝试时[[1,2,3],4,5],它会得到6答案,而不是15. 有人知道其中哪里有错误吗?

4

9 回答 9

9

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

var通过添加到 wheresuma被声明以使它们成为函数的本地来修复它:

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

于 2013-10-04T12:55:15.427 回答
3

我知道已经晚了,但他们说“从不迟到”:)

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]]])
于 2020-05-23T07:20:09.010 回答
2

对于 2018 年,此解决方案干净且实用:

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

flatreduce的文档。

于 2018-10-17T05:35:37.777 回答
0

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;
}
于 2013-10-04T12:46:29.977 回答
0

递归,例如

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

于 2013-10-04T12:52:10.350 回答
0

首先为什么你使用'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>
于 2013-10-04T13:32:16.443 回答
0

这可以通过 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>

于 2018-11-08T03:25:26.700 回答
0

干得好:

(我的假设是您想将字符串(例如“13”)解析为数字,以便将它们包含在总和中。如果没有,只需更改isNumbertypeof 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
于 2021-06-14T16:16:35.390 回答
-1
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]]]])    
于 2016-02-06T11:17:04.663 回答