如何检查2D数组中的每个项目的特定条件?

时间:2019-05-07 12:00:36

标签: javascript arrays p5.js

:)我正在使用JS和P5创建一个迷宫,其二维数组填充了数字0-8。 0是空白点,1是墙壁,2是与您同行的角色,3是出口,4-8是随机产生的物品。为了退出迷宫(通过固定位置上的3),需要收集所有项目(如果您走过一个项目,该位置的值将变回0),因此数组中的每个值应该小于4才能退出。现在,我需要一种方法来检查是否是这种情况。

我用every()尝试过,但是我猜想这仅适用于常规数组。我想我需要一个for循环,但我不知道这看起来如何。这就是我需要帮助的地方!

我的迷宫由18行和列组成,就像这样(但是还有15行)

let maze = [
    [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
    [1,2,0,0,0,0,1,0,1,0,0,0,0,1,0,0,1,0,1,0,0,0,3],
    [1,1,1,1,1,0,1,0,0,0,1,1,0,0,0,0,1,0,1,0,1,0,1]
]

物品随机产生,这已经起作用。现在我尝试检查每个值是否<= 3,每个都像这样

function checkBoard(mazenumbers){
  return mazenumbers <= 3;
}

function alertMazenumbers() {
   alert(maze.every(checkBoard));
}

希望这样,一旦您进入出口位置,便会通过警报显示

else if(direction === 'right') {
        if(maze[playerPos.y][playerPos.x + 1] == 3) {
            alertMazenumbers();
        }

如果每个值均<= 3,我希望得到一个警报,如果不是,则为false。 当前,有了这个every(),我确实得到了警报,但是即使清除了所有项目,它也只会返回false。

3 个答案:

答案 0 :(得分:2)

使用every可以使您步入正轨!

迷宫是一个数组数组(正如Denys在他的评论中提到的那样),因此您必须两次使用every,就像这样:

function canExitMaze(maze) {
  return maze.every(row => row.every(cell => cell <= 3))
}

如果您不认识箭头函数语法(=>this article进行了解释。

希望这会有所帮助!

答案 1 :(得分:0)

方法1:检查每个数组是否只包含<= 3的数字

let maze = [
  [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
  [1, 2, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 3],
  [1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1]
];

function testMaze(maze) {
  return maze.every(row => row.every(itemIsValid));
}

function itemIsValid(item) {
  return item <= 3;
}

console.log(testMaze(maze));
maze[2][4] = 4;
console.log(testMaze(maze));

方法2:合并数组并搜索数字

var maze = [
  [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
  [1, 2, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 3],
  [1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1]
];

function testMaze(maze) {
  return [].concat(...maze).every(itemIsValid);
}

function itemIsValid(item) {
return item <= 3;
}

console.log(testMaze(maze));
maze[2][4] = 4;
console.log(testMaze(maze));

方法3:将迷宫转换为字符串并使用正则表达式

var maze = [
  [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
  [1, 2, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 3],
  [1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1]
];

function testMaze(maze) {

  //or maze.toString().match(/\d+/g).every(x => itemIsValid(+x));
  return !/[4-8]/g.test(`${maze}`);
}

function itemIsValid(item) {
  return item <= 3;
}

console.log(testMaze(maze));
maze[2][4] = 4;
console.log(testMaze(maze));

答案 2 :(得分:0)

您可以通过执行以下操作来检查迷宫中的每个点是否都是<=3

const isTrue = num => num <= 3; // is a single cell true

const isRowTrue = row => row.every(isTrue); // are all cells in a row true
const isMazeTrue = rows => rows.every(isTrue); // are all cells in all rows true

const maze = [
  [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
  [1, 2, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 3],
  [1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1]
];

console.log(isMazeTrue(maze));