这是一个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;
}
})
})
}
答案 0 :(得分:9)
三个简单的步骤:
indexOf
数组中存在来自winningCombinations
数组的子数组的指定元素,请使用playerMoves
函数进行检查。 Array#filter
功能过滤掉它。 2
,则表示已出现两个(不多于或少于)元素 - 它符合我们的条件 - 再次使用另一个{{1}过滤它}。
Array#filter
答案 1 :(得分:2)
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);
答案 2 :(得分:1)
因为我们必须检查每个已过滤数组中的长度(匹配项),如何跳过对阵列的过滤数组的创建,并将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)