【问题标题】:Finding the sum of a nested array查找嵌套数组的总和
【发布时间】:2013-10-11 11:15:34
【问题描述】:

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

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。 有人知道哪里有错吗?

【问题讨论】:

  • 尝试将var sum移到函数上方
  • 我认为声明:var sum = 0;将为您解决问题。缺少关键字 var。

标签: javascript arrays sum


【解决方案1】:

您的代码的问题是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

【讨论】:

  • +1,似乎每个人都发现了缺少的var for sum,但没有人注意到它在 for 循环中丢失了。现场做得很好,也说明了问题!
【解决方案2】:

我知道现在很晚,但他们说“从不迟到”:)

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

【讨论】:

    【解决方案3】:

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

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

    flatreduce 的文档。

    【讨论】:

      【解决方案4】:

      递归,例如

      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
      

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


      你的不工作的原因是因为你需要varsuma

      【讨论】:

        【解决方案5】:

        您在其中缺少两个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;
        }
        

        【讨论】:

        • 我也是这么想的,但是测试还是6
        • Var 不会那样做 :)
        【解决方案6】:

        首先为什么你使用'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>
        

        【讨论】:

          【解决方案7】:

          这可以通过 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));
          }
          &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"&gt;&lt;/script&gt;

          【讨论】:

            【解决方案8】:

            给你:

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

            【讨论】:

              【解决方案9】:
              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]]]])    
              

              【讨论】:

              • 格式正确的代码总是易于阅读和理解。我已经为你格式化了这个答案。阅读this格式化帮助指南。
              • 请解释这段代码如何解决OP的问题。
              • 你用错误的编程语言回答...还有“from __builtin__ import int”o_O
              猜你喜欢
              • 2021-10-14
              • 2019-03-24
              • 2019-03-16
              • 1970-01-01
              • 1970-01-01
              • 2016-02-14
              • 1970-01-01
              • 2021-05-22
              • 2015-06-20
              相关资源
              最近更新 更多