2017-07-17 1 views
13

これは、チックタックのつま先ゲームアプリでの試みです。 私は2つの配列playerMoveswinningCombinationsを持っています。このような。
配列を配列の配列と比較するには?

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] 
     ]; 

Iはで-以上とで最もplayerMovesアレイの2つの値がwinningCombination各アレイと一致するように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; 
     }   
    }) 
    })  
} 

答えて

9

三つの簡単なステップ:

  • 使用indexOf機能winningCombinations配列の部分配列から指定された要素がplayerMoves配列中に存在するかどうか、チェックします。
  • もしそうなら - Array#filter機能で除外してください。
  • 返されたフィルタリングされたサブアレイの長さが2の場合、それは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

あなたはfilterincludesはそれを達成するために使用することができます。

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);

0

我々は長さ(マッチしたアイテム)を確認する必要があるためフィルタリングされた各配列どのように配列に対してフィルタリングされた配列の作成をスキップし、一致した要素の数に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)