1

存在しない配列インデックスにアクセスしようとした場合にJavaScriptがエラーをドロップしないようにする方法はありますか?

例:array[-1]エラーを返し、最終的にすべてのコードを壊します。'undefined'を返すだけで、スクリプトを続行するにはどうすればよいですか?配列をチェックする前にifステートメントを実装できます(インデックスがゼロよりも小さいか、配列サイズよりも大きい場合はスキップされます)が、これは非常に面倒です!

これは私のコードです:

if (grid[j-1][i])
n++;
if (grid[j+1][i])
n++;
if (grid[j][i+1])
n++;
if (grid[j][i-1])
n++;
if (grid[j-1][i-1])
n++;
if (grid[j+1][i+1])
n++;
if (grid[j-1][i+1])
n++;
if (grid[j+1][i-1])
n++;

これは、JとIの両方がゼロから始まる2つのループの内側にあります。私はそれらを変更したくなく、また別のifステートメントを記述したくありません(ご覧のとおり、すでにそれらが多すぎます!)。解決策はありますか?

ありがとう!

4

6 に答える 6

1

||エラーを消音するを使用できます。例:

(grid[j-1] || [])[i] || false

(私はこれをテストしていませんが、動作するはずです)

編集:私は私ではないの提案に基づいて更新

于 2012-04-22T01:33:00.667 に答える
1

グリッドの測定値がわかっている場合は、その周りに「センチネルセル」を配置できます。

配列に-1番目のインデックスを追加した場合x、それはカウントされませんx.length。リストに最後の要素を追加すると、が増加しますx.length

d_inevitableで言及されている算術カウントアルゴリズムと組み合わせたセンチネルセルを使用することは、ブランチを含まないため、最速のソリューションになると思います。イコライゼーションで1と0に評価される!!ため、省略してもかまいません。truefalse

アップデート:

インデックス-1は使用しないでください。通常の配列インデックスよりも非常に遅くなります。http://jsperf.com/index-1を参照してください。

于 2012-04-22T01:59:16.613 に答える
0

ifsを使用しながら、それほど面倒ではない方法は、最初のインデックスが定義されているかどうかをチェックすることです。

if (typeof grid[j-1] != "undefined" && grid[j-1][i])
于 2012-04-22T01:36:32.317 に答える
0

チェックを行う関数を作成できます。

function getArrayValue(arr,key) {
    if( key < 0 || key >= arr.length) return null;
    return arr[key];
}

しかし、実際には、とにかく範囲外のキーを回避する必要があります。

于 2012-04-22T01:38:39.167 に答える
0

あなたのソリューションではこれはどうですか?

for (dj = -1; dj <= 1; ++dj) {
  for (di = -1; di <= 1; ++di) {
    if ((dj || di) && grid[j+dj] && grid[j+dj][i+di]) {
        n++;
    }
  }
}   

上記のようにこれらすべてifを単一のループにリファクタリングする場合、追加の条件付きを実行する必要はそれほど悪くありません。

于 2012-04-22T01:45:05.847 に答える
0

私はこれを行います:

for(m = Math.max(j-1,0) ; m <= Math.min(j+1,grid.length-1) ; m++)
  for (p = Math.max(i-1,0) ; p <= Math.min(i+1, grid[m].length-1) ; p++)
     n += !(m == j && p == i) && !!grid[m][p];
于 2012-04-22T01:48:31.623 に答える