2016-12-02 2 views
2

プログラミングを開始して以来、グローバル変数を目指しているように見え、それらなしでは作業が難しく、再帰関数では特に困難でした。誰かがグローバル変数を無料にするためにこのコードを教えてくれますか?また、私は彼らの必要性を感じさせないように思考の方法を変えるのに役立つ参考資料がありますか?私は、コードが変わる必要があると思うような形で何かを感じますが、私は何がわかりません。このコードでグローバル変数を使用することに代わる最良の選択

var res = []; 
 

 
function steamrollArray(arr) { 
 
    // I'm a steamroller, baby 
 
    func(arr); 
 
    console.log(res); 
 
    return res; 
 
} 
 

 
steamrollArray([1, {}, [3, [[4]]]]); 
 

 
function func(array){ 
 
    for (var i=0; i<array.length ; i++){ 
 
    if (Array.isArray(array[i])){ 
 
     func(array[i]); 
 
    } 
 
    else { 
 
     res.push(array[i]); 
 
    } 
 
    } 
 
}

+2

FYI、このための通常の名前は* *は平らです。 – Barmar

+0

関数func()から値を返すだけで作業ができます。 –

答えて

1

配列とオブジェクトがJSで参照によって渡されているのであなたは、引数としてその配列を渡すことができます。

function steamrollArray(arr) { 
 
    // I'm a steamroller, baby 
 
    var res = []; 
 
    func(arr, res); 
 
    console.log(res); 
 
    return res; 
 
} 
 

 
steamrollArray([1, {}, [3, [[4]]]]); 
 

 
function func(array, res){ 
 
    for (var i=0; i<array.length ; i++){ 
 
    if (Array.isArray(array[i])){ 
 
     func(array[i], res); 
 
    } 
 
    else { 
 
     res.push(array[i]); 
 
    } 
 
    } 
 
}

+0

正確に答えを探していた、ありがとう。それは、私が思うように私が変わるのを手助けするだけで、変わることなく、最も単純な言葉でそれを説明しました。 – isam

1

別の方法は、単一の関数を使用した反復処理と一部だけがデータを収集したデータを返すを収集することです。

function steamrollArray(array) { 
 
    var result = []; 
 
    for (var i = 0; i < array.length; i++) { 
 
     if (Array.isArray(array[i])) { 
 
      result = result.concat(steamrollArray(array[i])); 
 
     } else { 
 
      result.push(array[i]); 
 
     } 
 
    } 
 
    return result; 
 
} 
 

 
console.log(steamrollArray([1, {}, [3, [[4]]]]));

2

ただ、関数内で変数を宣言し、最後にそれを返します。再帰呼び出しを適切に処理します。

function flatten(array){ 
 
    var res = []; 
 
    for (var item of array) { 
 
    if (Array.isArray(item)) 
 
     res.push(...flatten(item)); 
 
    else 
 
     res.push(item); 
 
    } 
 
    return res; 
 
} 
 
console.log(flatten([1, {}, [3, [[4]]]]));

これはまさにあなたのコードのように動作しませんが、それは1つが、おそらく期待するものです。

1

あなたは可能性が巣機能:

function steamrollArray(inputArray) { 
    var res = []; 
    var process = function(arrayToProcess){ 
    for (var i=0; i<arrayToProcess.length ; i++){ 
     if (Array.isArray(arrayToProcess[i])){ 
     process(arrayToProcess[i]); 
     } 
     else { 
     res.push(arrayToProcess[i]); 
     } 
    } 
    }; 
    process(inputArray); 
    return res; 
} 

steamrollArray([1, {}, [3, [[4]]]]); 
+0

私はこの解決策も大好きです!このケースで誰がより良い習慣であるかを誰かがコメントできますか?関数をネストするか、その結果を関数自体に別のパラメータとして送信しますか? – isam

1

reduceSpread operator (ES6)の助けを借りて、あなたも任意の変数代入せずに、あなたの問題を解決することができます:

function flatten(arr) { 
 
    return arr.reduce((p, c) => { 
 
    if (Array.isArray(c)) { 
 
     return [...p, ...flatten(c)]; 
 
    } 
 
    return [...p, c]; 
 
    }, []) 
 
} 
 

 
console.log(flatten([1, {}, [3, [[4]]]]));

1

[OK]をここに真の再帰があります:

console.log(f([1, {}, [3, [[4]]]])); 
 

 
function f(xs){ 
 
  if (xs.length === 0) return xs; 
 

 
  return (Array.isArray(xs[0]) ? f(xs[0]) : [xs[0]]).concat(f(xs.splice(1))); 
 
}

関連する問題