【问题标题】:How to sum nested arrays in JavaScript如何在 JavaScript 中对嵌套数组求和
【发布时间】:2021-03-29 10:39:32
【问题描述】:

我正在尝试创建一个对数组中所有值求和的函数,即使这些值嵌套在嵌套数组中。像这样: 计数数组(数组); --> 28 (1 + 2 + 3 + 4 + 5 + 6 + 7) 我试过这个递归函数,但它只是连接起来。

var countArray = function(array){
      var sum=0;
      for(let i=0; i<array.length; i++){
              if(array[i].isArray){
               array[i]=countArray(array[i]);
      }
    
          sum+=array[i];
        
        }
      
      return sum;
}

【问题讨论】:

标签: javascript arrays function


【解决方案1】:

使用Array.flat()将数组展平,然后使用Array.reduce()求和:

const countArray = array => 
  array.flat(Infinity)
    .reduce((sum, n) => sum + n, 0)

console.log(countArray([1, 2, [3, [4, 5], 6], 7]));

【讨论】:

    【解决方案2】:
    1. 使用Array.isArray 检查对象是否为数组。
    2. 每次将递归调用的结果加到 sum 中。

    var countArray = function(array) {
      var sum = 0;
      for (let i = 0; i < array.length; i++) {
        if (Array.isArray(array[i])) {
          sum += countArray(array[i]);
        } else {
          sum += array[i];
        }
      }
      return sum;
    }
    console.log(countArray([1, 2, [3, [4, 5], 6], 7]));

    您还可以将Array#reduce 与递归函数一起使用。

    const countArray = array => array.reduce((acc,curr)=>
       acc + (Array.isArray(curr) ? countArray(curr) : curr), 0);
    console.log(countArray([1, 2, [3, [4, 5], 6], 7]));

    这个问题可以简化为通过预先使用Array#flat 来查找一维数组中所有元素的总和。

    const countArray = array => array.flat(Infinity).reduce((acc,curr)=>acc+curr, 0);
    console.log(countArray([1, 2, [3, [4, 5], 6], 7]));

    【讨论】:

      【解决方案3】:

      除了Array.isArray的正确应用问题之外,您还有一个实际使用named function的用例,因为您递归地调用函数并且仅通过uzsing一个变量,函数的引用可能会消失。

      function countArray(array) {
          var sum = 0;
          for (const value of array) {
              sum += Array.isArray(value) ? countArray(value) : value;
          }
          return sum;
      }
      

      【讨论】:

        【解决方案4】:

        使用 ramda:

        const sumNested = compose(sum, flatten)

        【讨论】:

          【解决方案5】:

          您的工作示例:

          const arr = [1, [2, [3]]]
          
          const countArray = function(array) {
            let sum = 0;
          
            for (let i = 0; i < array.length; i++) {
              if (Array.isArray(array[i])) {
                sum += countArray(array[i]);
              } else {
                sum += array[i];
              }
            }
          
            return sum;
          }
          
          console.log(countArray(arr));

          稍微简化的例子:

          const arr = [1, [2, [3]]]
          
          const countArray = (array) => {
            let sum = 0;
          
            for (const el of array) {
              sum += Array.isArray(el) ? countArray(el) : el
            }
          
            return sum;
          }
          
          console.log(countArray(arr));

          更简单的代码:

          const arr = [1, [2, [3]]]
          
          const countArray = (array) =>
            array.reduce((sum, el) =>
              Array.isArray(el) ? sum + countArray(el) : sum + el, // reduce function
              0); // sum = 0 intialization
          
          console.log(countArray(arr));

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-09-25
            • 2017-11-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多