2017-07-17 36 views
13

Đây là một nỗ lực trong một ứng dụng trò chơi toe tic tac. Tôi có hai mảng playerMoveswinningCombinations. Như thế này.
Làm thế nào để so sánh một mảng với một mảng các mảng?

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

tôi cần phải lọc các mảng winningCombination như vậy mà ít-nhất và ít-nhất hai giá trị của playerMoves mảng phù hợp với từng mảng trong winningCombination.

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

nỗ lực của tôi

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

Trả lời

9

Ba bước đơn giản:

  • Sử dụng indexOf chức năng để kiểm tra, nếu yếu tố xác định từ mảng con của winningCombinations mảng hiện diện trong mảng playerMoves.
  • Nếu có - hãy lọc nó bằng chức năng Array#filter.
  • Nếu mảng con được trả về, được lọc có độ dài bằng 2, điều đó có nghĩa là hai thành phần không xuất hiện - nó đáp ứng điều kiện của chúng ta - lọc lại một lần nữa với Array#filter khác.

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

Bạn có thể sử dụng filterincludes để đạt được điều đó:

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

vì chúng ta phải kiểm tra với chiều dài (mục phù hợp) trong mỗi mảng được lọc , làm thế nào về bỏ qua việc tạo mảng lọc chống lại mảng và reducing nó vào một số yếu tố phù hợp và kiểm tra trực tiếp với điều đó thay vì 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)

Các vấn đề liên quan