How to compare an array to an array of arrays?

妖精的绣舞 提交于 2019-12-23 06:59:01

问题


This is an attempt in a tic tac toe game app. I have two arrays playerMoves and winningCombinations. Like this.

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 need to filter the winningCombination array such that at-least and at-most two values of playerMoves array matches with each array in winningCombination.

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

My attempt

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

回答1:


Three simple steps:

  • Use indexOf function to check, if specified element from the subarray of winningCombinations array is present in the playerMoves array.
  • If so - filter it out with Array#filter function.
  • If the returned, filtered subarray has length equal to 2, it means that two (no more, nor less) elements have appeared - it fulfills our condition - filter it once again with yet another 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:


You can use filter and includes to achieve that:

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



回答3:


since we have to check with the length (matched item) in each filtered array, how about skipping creation of filtered array against array and reducing it to a number of matched element and check directly with that instead of the 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)


来源:https://stackoverflow.com/questions/45152060/how-to-compare-an-array-to-an-array-of-arrays

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!