Подтвердить что ты не робот

Как сравнить массив с массивом массивов?

Это попытка в игровом приложении tic tac toe. У меня есть два массива playerMoves и winningCombinations. Как это.

var playerMoves= [0,1,4];
var winningCombinations = [
        [0,1,2],[3,4,5],[6,7,8],
        [0,3,6],[1,4,7],[2,5,8],
        [0,4,8],[2,4,6]
      ];

Мне нужно отфильтровать массив winningCombination таким образом, чтобы наименьшее и не более двух значений массива playerMoves соответствовало каждому массиву в winningCombination.

findPossibleMove(playerMoves);
// should return [[0,1,2],[1,4,7], [0,4,8] ]

Моя попытка

function findPossibleMove(arr){
  var found = 0;
  return arr.forEach((item)=>{
    winningCombinations.map((obj)=>{
      if(obj.indexOf(item) !== -1) {
        found++;
      }
      if(found===2){
        return obj;
      }        
    })
  })      
}
4b9b3361

Ответ 1

Три простых шага:

  • Используйте функцию indexOf для проверки, если указанный массив из массива winningCombinations присутствует в массиве playerMoves.
  • Если это так - отфильтруйте его с помощью функции Array#filter.
  • Если возвращаемый, отфильтрованный субарфейс имеет длину, равную 2, это означает, что появились два (не более или менее) элемента - он выполняет наше условие - еще раз отфильтруйте его еще одним Array#filter.

let playerMoves = [0, 1, 4];
let winningCombinations = [
  [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 res = winningCombinations.filter(v => v.filter(c => {
  return playerMoves.indexOf(c) > -1;
}).length == 2);
  
  console.log(JSON.stringify(res));

Ответ 2

Вы можете использовать filter и includes для достижения этого:

var playerMoves= [0,1,4];
var winningCombinations = [
  [0,1,2],[3,4,5],[6,7,8],
  [0,3,6],[1,4,7],[2,5,8],
  [0,4,8],[2,4,6]
];

var filteredCombinations = winningCombinations.filter((combination) =>
  combination.filter(x => playerMoves.includes(x)).length === 2);

console.log(filteredCombinations);

Ответ 3

так как мы должны проверять длину (согласованный элемент) в каждом отфильтрованном массиве, как пропустить создание фильтрованного массива против массива и reducing его на несколько согласованных элементов и напрямую проверить это вместо length?

let playerMoves = [0, 1, 4];
let winningCombinations = [
  [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 res = winningCombinations.filter(a=> a.reduce((r, v) => r + playerMoves.includes(v), 0)==2);

console.log('matching array: ', res)