我需要帮助来尝试获取多维数组的总和

时间:2018-07-07 03:03:23

标签: javascript sum

var nestedArr3 = [[[1,2],[3,4]],[[5,6]]];

function sumTotal() {
  var sum = 0;
  for (var i = 0; i < nestedArr3.length; i++) {
    for (var j = 0; j < nestedArr3[i].length; j++) {
      if (typeof nestedArr3[i][j] === "number") {
        sum += nestedArr3[i][j];
      } else if (Array.isArray(nestedArr3[i][j] === true)) {
        sumTotal(nestedArr3[i][j]);
      }
    }
  }
  return console.log(sum);
}

console.log(sumTotal());

我得到的结果是0。我不知道如何解决此代码。任何帮助,将不胜感激。

5 个答案:

答案 0 :(得分:5)

一些问题:

  • 如果要尝试使用递归解决方案,最好只在再次调用sumTotal之前尝试递归一个元素,否则您将重复(WET)代码

  • 使用递归时,您需要最后return以便调用者可以访问结果

  • Array.isArray(nestedArr3[i][j] === true))看起来像是一个错字-将true通话中的Array.isArray 外面移出

这是工作代码:

var nestedArr3=[[[1,2],[3,4]],[[5,6]]]

function sumTotal(arr) {
  var sum = 0;
  for (var i = 0; i < arr.length; i++) {
    if (typeof arr[i] === "number") {
      sum += arr[i];
    } else if (Array.isArray(arr[i])) {
      sum += sumTotal(arr[i]);
    }
  }
  return sum;
}

console.log(sumTotal(nestedArr3));

但是,假设所有元素和子元素都是数字或数组,则使用reduce会更清洁。

var nestedArr3=[[[1,2],[3,4]],[[5,6, [[100, 100, [100]]] ]]]
const sumTotal = (arr) => arr.reduce(
  (a, element) => a + (
    typeof element === 'number' ? element : sumTotal(element)
  ),
  0
);
console.log(sumTotal(nestedArr3));

答案 1 :(得分:1)

@Jiajie Xu ,如果您正在使用递归来使用此代码获取 sum ,请不要这样做。我对其进行了更改以使其正常运行。请看看。

  

始终确保编写一个 reusable 函数,这就是为什么这里将1个参数作为数组的原因。

     

我使用了 filter()方法来获取数组元素的总和。检查
  Legendre's three-square theorem了解详情。

function sumTotal(nestedArr3) {
    sum = 0
    for(var i = 0; i < nestedArr3.length; i++) {
        if(typeof nestedArr3[i] === "number"){
            return nestedArr3.reduce((num1, num2) => num1 + num2);
        } else 

        if(Array.isArray(nestedArr3[i]) === true){
            sum += sumTotal(nestedArr3[i]);
        }            
    }
    return sum
}

// TEST
var nestedArr3 = [[[1,2],[3,4]],[[5,6]]];

console.log(sumTotal(nestedArr3)) // 21

答案 2 :(得分:0)

首先,您需要展平阵列。我从Mozilla

使用此功能
function flattenDeep(arr1) {
   return arr1.reduce((acc, val) => Array.isArray(val) ? acc.concat(flattenDeep(val)) : acc.concat(val), []);
}

从那里,您可以只使用reduce

var result = flattenDeep(nestedArr3).reduce((a,c) => a+c);

答案 3 :(得分:0)

如果只想使用for循环来解决它,就缺少数组的额外维度。解决方案应该是这样的:

function total(array) {
var sum = 0

for (var i = 0; i < array.length; i++) {
    for (var j = 0; j < array[i].length; j++) {
      for (var k = 0; k < array[i][j].length; k++) {
        if (typeof array[i][j][k] === 'number') {
          sum += array[i][j][k]
        }
      }
    }
  }
  return sum
}

console.log(total([[[1,2],[3,4]],[[5,6]]]))

答案 4 :(得分:0)

使用.join()展平数组,然后使用.reduce() :

求和

var nestedArr3 = [[[1,2],[3,4]],[[5,6]]];

var sum = nestedArr3.join().split(',').reduce((total, curr) => {
  return total + +curr // +curr is shorthand for parseInt
}, 0)

console.log(sum);