その秘訣は、コードを複数の関数に抽象化することです。行を作成するためのコードを行列を作成するためのコードから切り離すと、すべてを 1 つのメガファンクションに詰め込むよりも、何が起こっているかについて思考問題を簡単にまとめることができます。
最初に、行の作成という簡単な問題に取り組みましょう。返される行の長さと、最初のセルの初期値 (1 か 0 か) を制御したいようです。これは、2 つのパラメーターを受け取る関数を呼び出します。
function makeMatrixRow(size, initialValue) { }
必要なコードは非常に単純です。
function makeMatrixRow(size, initialValue) {
var n = [];
for (var i = 0, flag = !!initialValue;
i < size;
i++, flag = !flag) {
n.push(0+flag+0);
}
return n;
}
ほとんどのロジックを for ループの定義に組み込みました。分解するのはそれほど難しくないはずです。トリッキーなビットは、"!!initialValue" と "0+flag+0" だけです。1 つ目は、initialValue を true/false 値 (ブール値) に変換します。2 番目は、このブール値を数値に戻します。明らかに、両側にゼロを追加する必要はありませんでしたが、その対称性を楽しんでいます-さらに、このようにバーベルのように見えると思います:)
その機能があれば、行列の生成は簡単です。ネストされたループをいじる必要はありません。問題は、配列を埋めるための単純な反復に縮小されました。
function makeMatrix(size) {
var matrix = [];
for (var i = 0; i < size; i++) {
matrix.push(makeMatrixRow(size, i % 2 == 0));
}
return matrix;
}
i % 2 == 0 は均一性をテストしています。直接渡すのではなく、それを独自の変数割り当てに分割する方が良い場合があります。追加の変数をここかそこに追加すると、コメントの適切な代替となる可能性があります。
for (var i = 0; i < size; i++) {
var isEvenRow = (i % 2 == 0);
matrix.push(makeMatrixRow(size, isEvenRow));
}
以上です!全体として、コードは次のようになります。
function makeMatrixRow(size, initialValue) {
var n = [];
for (var i = 0, flag = !!initialValue;
i < size;
i++, flag = !flag) {
n.push(0+flag+0);
}
return n;
}
function makeMatrix(size) {
var matrix = [];
for (var i = 0; i < size; i++) {
matrix.push(makeMatrixRow(size, i % 2 == 0));
}
return matrix;
}
少し長くなりますが、私は単一の機能ソリューションよりもそれを好みます...しかし、それぞれ独自のものに!