简体   繁体   English

如何对 JavaScript 中的嵌套 arrays 求和

[英]How to sum nested arrays in JavaScript

I'm trying to create a function that sums the total of all the values in an array, even if those values are nested within nested arrays.我正在尝试创建一个 function,它将数组中所有值的总和相加,即使这些值嵌套在嵌套的 arrays 中。 Like this: countArray(array);像这样:countArray(array); --> 28 (1 + 2 + 3 + 4 + 5 + 6 + 7) I tried this recursive function, but it just concatenates. --> 28 (1 + 2 + 3 + 4 + 5 + 6 + 7) 我试过这个递归 function,但它只是连接起来。

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

Flatten the array using Array.flat() , and then sum using Array.reduce() :使用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]));

  1. Use Array.isArray to check if an object is an array.使用Array.isArray检查 object 是否为数组。
  2. Add the result of the recursive call to the sum each time.每次将递归调用的结果加到 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]));

You could also use Array#reduce with a recursive function.您还可以将Array#reduce与递归 function 一起使用。

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

This problem can be simplified to finding the sum of all elements in a one-dimensional array by using Array#flat beforehand.这个问题可以简化为通过预先使用Array#flat来查找一维数组中所有元素的总和。

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

Beside the problem of right application of Array.isArray , you have an actual use case for taking a named function , because you call the function recursively and by uzsing just a variable, the reference of the function could go. Beside the problem of right application of Array.isArray , you have an actual use case for taking a named function , because you call the function recursively and by uzsing just a variable, the reference of the function could go.

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

Your working example:您的工作示例:

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

A little bit simplified example:一个简单的例子:

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

Even more simple code:更简单的代码:

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

Using ramda:使用 ramda:

const sumNested = compose(sum, flatten) const sumNested = compose(sum, flatten)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM