查找嵌套数组的总和

时间:2013-10-04 12:44:34

标签: javascript arrays sum

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

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.我不知道为什么。

9 个答案:

答案 0 :(得分:7)

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

通过将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

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

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

答案 3 :(得分: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>

答案 4 :(得分:0)

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

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

flatreduce的文档。

答案 5 :(得分: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>

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

给你:

(我的假设是您想将字符串(例如“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

答案 8 :(得分:-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]]]])