2017-07-17 23 views
13

यह एक टिक टैक पैर गेम ऐप में एक प्रयास है। मेरे पास दो एरे 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; 
     }   
    }) 
    })  
} 

उत्तर

9

तीन सरल कदम: जांच करने के लिए

  • उपयोग indexOf समारोह, अगर winningCombinations सरणी के subarray से निर्दिष्ट तत्व 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);

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)

संबंधित मुद्दे