如何检查javaScript中多维数组中两个元素是否并排

时间:2018-07-26 18:22:20

标签: javascript multidimensional-array

我将直奔主题。.因此,我创建了一个多维数组,并且具有如下所示:

var arr = [];

for (var i = 0; i < 10; i++) {

    var sArr = [];

    for (var a = 0; a < 10; a++) {

        cell = Object.create(cellObj)

        sArr.push(cell);

    }

    arr.push(sArr);

}

关于cellObj,我是这样创建的:

var cellObj = {

state: 0,
img: ""

};

现在我已完成所有设置,我将在多维数组中生成两个图像,如下所示:

//the array imgs contain two images

for (var l = 0; l < imgs.length; l++) {

    var x = Math.floor(Math.random() * arr.length);

    var y = Math.floor(Math.random() * arr[x].length);

    //here is a test to make sure that the two images are in two separate cells

    if (arr[x][y].state === 0) {

        arr[x][y].state = 3;

        arr[x][y].img = imgs[l];

    }
    else
    {
        l--;
    }

}

两个图像可以位于同一行或同一列中,并且它们之间有一个空白单元格,但我不希望它们在水平或垂直方向上并排放置。

我希望所有人都过得愉快,谢谢。

1 个答案:

答案 0 :(得分:0)

实现您要寻找的内容的最简单方法是预先消除这些选择。在下面的方法中,我将创建一个包含所有位置的平面数组(为清楚起见,我将arr重命名为arrayOfImages)并将其命名为coordLookup。放置图像后,垂直和水平位置旁边的位置将从filter语句中的coordLookup中删除。我已经增加了测试图像的数量,以表明它保持了该间距-请注意,如果您尝试放置的图像数量超出了数组可容纳的空间,它将开始失败,因此请确保为这种情况。

(要查看运行情况,请打开控制台并运行代码段,它应将完整的数组显示为表格。)

var cellObj = {
state: 0,
img: ""
};

var arrayOfImages = [];

for (var i = 0; i < 10; i++) {

    var sArr = [];

    for (var a = 0; a < 10; a++) {

        cell = Object.create(cellObj)

        sArr.push(cell);

    }

    arrayOfImages.push(sArr);

}

var coordLookup = [], i = 10, j = 10 //create coordinate lookup
while(--i > -1){
  j = 10
  while(--j > -1){
    coordLookup.push([i,j])
  }
}

var imgs = ['image1.jpg', 'image2.jpg', 'image1.jpg', 'image2.jpg', 'image1.jpg', 'image2.jpg', 'image1.jpg', 'image2.jpg', 'image1.jpg', 'image2.jpg', 'image1.jpg', 'image2.jpg']

for (var l = 0; l < imgs.length; l++) {

  let pairIndex = Math.floor(Math.random() * coordLookup.length),
    pair = coordLookup[pairIndex],
    x = pair[0], y = pair[1]
  //insert image
   arrayOfImages[x][y].state = 3;
   arrayOfImages[x][y].img = imgs[l]
  //disable horizontal and vertical neighbor cells
  const prevX = x - 1, nextX = x + 1, prevY = y - 1, nextY = y + 1
  
  coordLookup = coordLookup.filter(coordpair => {
    const _x = coordpair[0], _y = coordpair[1],
      isMatch = (_y == y && _x >= prevX && _x <= nextX) || (_x == x && _y >= prevY && _y <= nextY)
    
    return !isMatch
  })
}

//display results
console.table(arrayOfImages.map(row => row.map(cell => JSON.stringify(cell))))