防止javascript走出数组

时间:2012-04-22 01:28:21

标签: javascript arrays

如果我尝试进入不存在的数组索引,有什么方法可以防止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.我不想改变它们,也不想写另一个if语句(你可以看到,它们已经有太多了!)。有没有解决方案?

谢谢!

6 个答案:

答案 0 :(得分:1)

您可以使用||来消除错误,例如:

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

(我没有测试过这个,但它应该有用)

编辑:更新基于我不是我的建议

答案 1 :(得分:1)

如果您知道网格的尺寸,可以在其周围放置“哨兵细胞”。

如果向数组x添加第-1个索引,则不会计入x.length。将额外的最后一个元素添加到列表中会增加x.length

我敢说使用哨兵细胞结合d_inevitable提到的算术计数算法将是最快的解决方案,因为它不涉及分支。您甚至可以省略!!,因为true将在均衡中评估为1,false评估为0.

更新

不要使用索引-1。它比正常的数组索引慢得多。请参阅http://jsperf.com/index-1

答案 2 :(得分:0)

在使用ifs时,一种不那么繁琐的方法是检查第一个索引是否已定义:

if (typeof grid[j-1] != "undefined" && grid[j-1][i])

答案 3 :(得分:0)

您可以创建一个功能来进行检查:

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

但实际上你应该避免使用越界键。

答案 4 :(得分: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重构为如上所述的单个循环,那么必须做额外的条件并不是那么糟糕。

答案 5 :(得分: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];