2017-03-12 98 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);