Javascript: поиск массива в массиве массивов

Я смотрю на лучший способ поиска экземпляра массива, содержащего элементы данного массива, в массиве массивов.

Теперь я понимаю, что это запутанная линия. Итак, вот пример для иллюстрации сценария.

У меня есть поисковый набор, представляющий собой массив из 9 предметов, представляющий игровую доску из 9 ячеек. Значения могут быть 1, 0 или же null:

var board = [1, 0, 1, 1, 0, 1, 0, 0, null];

У меня также есть набор результатов, который представляет собой массив массивов:

var winningCombos = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]]

Каждый массив в winningCombo представляет индексы в board массив, то есть выигрышные комбинации.

Есть 8 выигрышных комбинаций.

Каждая выигрышная комбинация представляет собой группу из 3 индексов, которые выиграли бы, если их значения равны 1.

т.е. чтобы выиграть, доска может быть:

board = [1,1,1,0,0,0,null,null,0]; // Index 0,1, and 2 are 1, matching winningCombos[0]

или же

board = [null,null,1,0,1,0,1,null,0]; // Index 2,4, and 6 are 1, matching winningCombos[7]

Мой вопрос:

Как в Javascript выполнить эту операцию (возможно, с ES6)?

Что я придумала до сих пор, так это:

const win = [[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 board = [null,null,1,0,1,0,1,null,0];

let score = [];

board.forEach(function(cell, index) 
    {
      if(cell === 1) 
        score.push(index);
});
console.log(score);
console.log(win.indexOf(score) > -1)

Но мне трудно найти массив в массиве массивов. Хотя score является [2,4,6] и этот точный массив существует в win, это не проявляется в результате, из-за способа, которым равенство объектов работает в Javascript, я предполагаю.

Короче говоря, я пытаюсь увидеть, если score существует в win

Я нашел это решение, но оно кажется довольно хакерским. Есть ли лучший способ справиться с этим?

2 ответа

Решение

Ты можешь использовать Array.prototype.some(), Array.prototype.every() проверить каждый элемент win, score

const win = [
  [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 board = [null, null, 1, 0, 1, 0, 1, null, 0];

let score = [];

board.forEach(function(cell, index) {
  if (cell === 1)
    score.push(index);
});
console.log(score);
let bool = win.some(function(arr) {
  return arr.every(function(prop, index) {
    return score[index] === prop
  })
});
console.log(bool);

Используя ES6, вы можете отобразить win массив фактических значений в каждом из этих мест:

const win = [[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 board = [null,null,1,0,1,0,1,null,0];
let winning_spots = win.map((spots) => spots.map((i) => board[i]));
>>> winning_spots
[[null, null, 1], [0, 1, 0], [1, null, 0], [null, 0, 1], [null, 1, null], [1, 0, 0], [null, 1, 0], [1, 1, 1]]

Затем мы можем отфильтровать, по каким из них все имеют 1 или 0:

let one_winners = winning_spots.filter((spots) => spots.every((e) => e == 1));
let zero_winners = winning_spots.filter((spots) => spots.every((e) => e == 0));
>>> one_winners
[[1, 1, 1]]
>>> zero_winners
[]

Наконец, если мы хотим выяснить, есть ли победитель, просто проверьте длины:

let is_winner = (one_winners.length + zero_winners.length) > 0
Другие вопросы по тегам