2017-03-12 22 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のコンソールである以下のスクリーンショットで見ることができます。

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

P.S.:

+0

を使用することができます。 (少なくともあなたのコードでのやり方とは異なります)。[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

それは素晴らしい解決の友人です。 3ドット(... arr)のコンセプトは何ですか? –

2

あなたはreturnが欠落していますアレイの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

再帰は必要ありません。あなたも、あなたが持っている最初の問題は、JavaScriptが関数の引数のデフォルト値をサポートしていないということです.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);

関連する問題