2017-07-17 52 views
13

Bu tic tac toe oyun uygulamasında bir girişimdir. İki dizim var playerMoves ve winningCombinations. Bunun gibi.
Dizileri dizi dizisiyle karşılaştırmak nasıl?

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-en az ve en-en playerMoves dizinin iki değerin winningCombination her dizi ile eşleşen şekilde winningCombination dizi filtre gerekir.

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

girişimim

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

cevap

9

üç basit adımda: winningCombinations dizinin altdizilim belirtilen eleman playerMoves dizisinde varsa

  • Kullanım indexOf fonksiyonu kontrol etmek.
  • Eğer varsa - Array#filter işleviyle filtreleyin.
  • İade edilen, filtre uygulanmış alt dizinin uzunluğu 2'a eşitse, iki (daha fazla veya daha az) öğenin göründüğü anlamına gelir - durumumuzu karşılar - bir daha Array#filter ile bir kez daha süzün.

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

Sen filter ve includes Bunu başarmak için kullanabilirsiniz:

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

biz uzunluğu (eşleşti öğe) ile kontrol etmesi gerekir çünkü filtrelenen her dizide , dizi ve filtrelenmiş dizi oluşturulmasını atlamak hakkında bir dizi eşleştirilmiş öğeye ve length yerine doğrudan kontrol edin?

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)