Как сравнить массив с массивом массивов?
Это попытка в игровом приложении 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;
}
})
})
}
Ответы
Ответ 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)