Я б на твоем месте прислушался к Рони, но раз ты так начал, то здесь продолжение
const checkWin = (field) =>{
for (let i = 0; i < field.length; i++) {
for(let j = 0; j < field[i].length; j++){
if(gameTurn === field[i][j] &&
(field[i][j+1] !==undefined && gameTurn === field[i][j+1] &&
field[i][j+2] !==undefined && gameTurn === field[i][j+2]) ||
(field[i+1][j] !==undefined && gameTurn === field[i+1][j] &&
field[i+2][j] !==undefined && gameTurn === field[i+2][j]) ||
(field[i+1][j+1] !==undefined && gameTurn === field[i+1][j+1] &&
field[i+2][j+2] !==undefined && gameTurn === field[i+2][j+2]) ||
(field[i-1][j-1] !==undefined && gameTurn === field[i-1][j-1] &&
field[i-2][j-2] !==undefined && gameTurn === field[i-2][j-2])
)
alert('Ты победил!')
}
}
}
но лучше делать отдельные циклы по всем четырем направлениям (горизонт, вертикаль, диагонали в разных направлениях) и в for "не добегать" до края на 2 клетки. И тогда у нас можно не проверять на существования элемента и меньше операций будет совершено
const checkWin = (field) =>{
gameTurn=1;
for (let i = 0; i < field.length; i++) {
for(let j = 0; j < field[i].length-2; j++){
if(gameTurn === field[i][j] &&
(gameTurn === field[i][j+1] && gameTurn === field[i][j+2])
)
alert('Ты победил! 1')
}
}
for (let i = 0; i < field.length-2; i++) {
for(let j = 0; j < field[i].length; j++){
if(gameTurn === field[i][j] &&
(gameTurn === field[i+1][j] && gameTurn === field[i+2][j])
)
alert('Ты победил! 2')
}
}
for (let i = 0; i < field.length-2; i++) {
for(let j = 0; j < field[i].length-2; j++){
if(gameTurn === field[i][j] &&
(gameTurn === field[i+1][j+1] && gameTurn === field[i+2][j+2])
)
alert('Ты победил! 3')
}
}
for (let i = 0; i < field.length-2; i++) {
for(let j = 2; j < field[i].length; j++){
if(gameTurn === field[i][j] &&
(gameTurn === field[i+1][j-1] && gameTurn === field[i+2][j-2])
)
alert('Ты победил! 4')
}
}
}
checkWin([[,1,1],[,1,],[1,,]])