2017-07-17 63 views
13

Jest to próba w aplikacji gier tic tac toe. Mam dwie tablice playerMoves i winningCombinations. Lubię to.
Jak porównać tablicę z tablicą tablic?

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

trzeba odfiltrować tablicy winningCombination tak, że co najmniej, a w skrajnej dwóch wartości playerMoves tablicy odpowiada z jednej tablicy w winningCombination.

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

Moja próba

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

Odpowiedz

9

Trzy proste kroki:

  • Zastosowanie indexOf funkcja, aby sprawdzić, czy określony pierwiastek z subarray z winningCombinations tablicy jest obecny w tablicy playerMoves.
  • Jeśli tak, odfiltruj go za pomocą funkcji Array#filter.
  • Jeśli zwrócona, odfiltrowana podstryczka ma długość równą 2, oznacza to, że pojawiły się dwa (nie więcej, mniej, ani więcej) elementów - spełnia ona nasz warunek - odfiltruj go jeszcze raz z kolejnym 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

Można użyć filter i includes to osiągnąć:

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

ponieważ musimy sprawdzić w długości (dopasowanej pozycji) w każdej przefiltrowanej tablicy , co powiesz na pomijanie tworzenia tablicy filtrowanej względem tablicy i reducing do liczby dopasowanych elementów i sprawdzasz bezpośrednio z tym zamiast 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)