Javascript 2D数组函数

时间:2018-06-04 10:58:34

标签: javascript

我有一个2D数组,其中包含truefalse。 我创建了一个函数,它返回该数组中的邻居数(在所有8个方向上),即true。 但由于某些未知原因,它不能正常工作(返回错误数量的邻居)。 (是的,我正在制作康威的生命游戏。)

function neighbors(seq, x, y) {
   var cnt = 0;
   try {
    if (seq[y-1][x]){
        cnt++;
    }
   }
   catch(err) {

   }
   try {
    if (seq[y][x-1]){
        cnt++;
    }
   }
   catch(err) {

   }
   try {
    if (seq[y][x+1]){
        cnt++;
    }
   }
   catch(err) {

   }
   try {
    if (seq[y+1][x]){
        cnt++;
    }
   }
   catch(err) {

   }
   try {
    if (seq[y-1][x+1]){
        cnt++;
    }
   }
   catch(err) {

   }
   try {
    if (seq[y-1][x-1]){
        cnt++;
    }
   }
   catch(err) {

   }
   try {
    if (seq[y+1][x-1]){
        cnt++;
    }
   }
   catch(err) {

   }
   try {
    if (seq[y+1][x+1]){
        cnt++;
    }
   }
   catch(err) {

   }        
   return cnt;
}

此代码基本上是从我的Python代码翻译而来的。

2 个答案:

答案 0 :(得分:4)

您可以带一个包含所有需要指示的对象进行计数。

然后检查索引是否是数组的键并检查嵌套级别。添加全部并返回该值。

function neighbors(seq, i, j) {
    var directions = [{ x: 0, y: -1 }, { x: -1, y: -1 }, { x: -1, y: 0 }, { x: -1, y: 1 }, { x: 0, y: 1 }, { x: 1, y: 1 }, { x: 1, y: 0 }, { x: 1, y: -1 }];

    return directions.reduce((r, { x, y }) => {
            x += i;
            y += j;
            return r + (x in seq && seq[x][y] || 0);
        }, 0);
}

答案 1 :(得分:1)

您可以简化以下功能。

var seq = [[false,false,false,false],
           [false,true,false,false],
           [false,true,false,false],
           [false,true,false,false]]
function neighbors(seq, x, y) {
   var cnt = 0;
   var controls = [{x:0,y:1},{x:0,y:-1},
                    {x:1,y:0},{x:1,y:1},{x:1,y:-1},
                    {x:-1,y:0},{x:-1,y:1},{x:-1,y:-1}]
   for (var index in controls) {
      var newX = x+controls[index].x;
      var newY = y+controls[index].y;
      if(newX >= 0 && newY >= 0 && newX < seq.length && newY < seq[newX].length
        && seq[newX][newY]) {
        cnt++;
      }
   }       
   return cnt;
}

console.log(neighbors(seq, 0,1))
console.log(neighbors(seq, 1,0))
console.log(neighbors(seq, 2,2))