2017-03-12 69 views
1

我想总结JavaScript中的多维数组的总数,但它不提供正确的值,因为嵌套数组与总和连接。以下是我的代码:递归总结JavaScript多维数组

var arr = [1, 2, 3, [4, 3], [10, 50], 98, 100]; 

    function recursion(array, length = 0) { 
     if (array.length === length) return 0; 

     if (Array.isArray(array[length])) { 
      recursion(array[length]); 
     } 
     console.log(array[length]); 

     return array[length] + recursion(array, length + 1); 
    } 

    console.log(recursion(arr)); 

错误可以在下面的屏幕截图中看到,它是google chrome的控制台。

+0

那么,你必须第一个问题是,JavaScript不支持函数默认参数。 (至少不要以你在代码中的方式)。请参阅[MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Default_parameters) –

+1

如果递归不是需要的话,你可以简单地用'concat'和'reduce'完成这个:'[] .concat(... arr).reduce((a,b)=> a + b)' –

+0

@StephenThomas注意,'' javascript'确实支持默认参数。 – guest271314

回答

0

你甚至都不需要这个功能。该能力被构建在Array原型中。

const arr = [1, 2, 3, [4, 3], [10, 50], 98, 100] 
 
const sum = [].concat(...arr).reduce((acc, curr) => acc + curr) 
 

 
console.log(sum)

+0

这是一个梦幻般的解决方案的朋友。你能告诉我那里有三个点(... arr)的概念吗? –

2

你缺少一个return

... 
if (Array.isArray(array[length])) { 
    return recursion(array[length]); 
} 
... 

附:我建议将参数名称从length更改为其他(可能是position)以避免与数组的属性混淆。

1

function sum(e) {      // take an element and return it if it's not an array or return the recursive sum if it's an array 
 
    if(e instanceof Array) {    // if it's an array 
 
    return e.reduce(function(s, e) { // call sum on each item of the array and return the accumulated sum 
 
     return s + sum(e); 
 
    }, 0); 
 
    } 
 
    else         // else (if it's not an array) then return the item 
 
    return e; 
 
} 
 

 
var arr = [1, 2, 3, [4, 3], [10, 50], 98, 100]; 
 

 
console.log(sum(arr));

0

另一种方式做,这是使用reduce()

var arr = [1, 2, 3, [4, 3],[10, 50], 98, 100]; 
 

 
function recursion(array) { 
 
    return array.reduce(function(r, e) { 
 
    return r += Array.isArray(e) ? recursion(e) : e 
 
    }, 0) 
 
} 
 

 
console.log(recursion(arr)); 
 
console.log(recursion([1, [[[1, [[[2]]]]]]]));

0

递归是没有必要的。您可以使用.toString().split().reduce()

var arr = [1, 2, 3, [4, 3], [10, 50], 98, 100]; 
 
var n = arr.toString().split(/,/).reduce(function(a, b) {return +a + +b}); 
 

 
console.log(n);