猿问

检查一个数组是否包含另一个数组的元素

我正在尝试使用 javascript 制作井字游戏。我在嵌套数组中有获胜条件


const winConditions = [

            [0, 1, 2],

            [3, 4, 5],

            [6, 7, 8],

            [0, 3, 6],

            [1, 4, 7],

            [2, 5, 8],

            [0, 4, 8],

            [2, 4, 6]

]

我在数组中有当前玩家的标记框索引


let squaresIndices = [0,4,8]

当任何获胜条件发生时,我试图停止游戏。我已经尝试了以下每一项,但我不明白为什么它们不起作用。


winConditions.forEach((array) => {

    if (array === squaresIndices){

        alert("Game Over")

    }

//////


if (winConditions.includes(squaresIndices)){

    alert ("Game Over")

}

//////

        winConditions.some((arr) =>{

            if (arr.every((square) => {

                squaresIndices.includes(square)

            })) {

                alert("Game Over")

            }

        })


凤凰求蛊
浏览 109回答 3
3回答

精慕HU

首先数组不能比较试试这个例子let a = [0,2,3]let b = [0,2,3]alert( a === b )您需要了解的是,当您保存数组时。您实际上所做的是在内存中创建对该数组的引用。然后再次尝试这个例子let a = [0,2,3]let b = aalert( a === b )你会明白的,为什么?因为在第一种情况下,您尝试在内存中使用两个单独的地址。这意味着a & b 地址不同但相同kind of apartment。但在第二种情况下,您正在比较相同的地址。因此,最简单的方法是将它们转换为字符串,然后尝试比较它们。JSON.stringify(a)==JSON.stringify(b)然后你就会得到你想要的结果。虽然如果这些数组实例的属性顺序始终相同,那么这可能会起作用,但这为极其讨厌的错误敞开了大门,这些错误可能很难追踪。

斯蒂芬大帝

如果不是忘记返回值并将 if 移到外部,那么您的最后一个示例是正确的。const winConditions = [    [0, 1, 2],    [3, 4, 5],    [6, 7, 8],    [0, 3, 6],    [1, 4, 7],    [2, 5, 8],    [0, 4, 8],    [2, 4, 6]];const squaresIndices = [0, 4, 8];const isWin = winConditions.some(    (arr) =>    {        // return if this combination is matching or not        return arr.every(            (square) =>            {                // return if the value matches or not                return squaresIndices.includes(square);            }        );    });// Then test the resultif (isWin){    alert("Game Over");}

holdtom

winConditions.forEach((array) => {    if(JSON.stringify(array)==JSON.stringify(squaresIndices)){        alert("Game Over")    }})您不能直接在 JavaScript 中比较两个数组。您需要将其转换为字符串以进行比较。您还可以使用 toString() 而不是 JSON.stringify()
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答