0

我正在寻找在数组数组中搜索包含给定数组元素的数组实例的最佳方法。

现在,我明白这是一条令人困惑的路线。所以这里有一个例子来说明这个场景。

我有一个搜索集,它是一个包含 9 个项目的数组,代表 9 个单元格的游戏板。这些值可以是1,0null:

var board = [1, 0, 1, 1, 0, 1, 0, 0, null];

我还有一个结果集,它是一个数组数组:

var winningCombos = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]]

中的每个数组winningCombo代表数组中的索引board即获胜组合。

有8个获胜组合。

每个获胜组合是一组 3 个指数,如果它们的值都为 1,则它们将获胜。

即获胜,董事会可能是:

board = [1,1,1,0,0,0,null,null,0]; // Index 0,1, and 2 are 1, matching winningCombos[0]

或者

board = [null,null,1,0,1,0,1,null,0]; // Index 2,4, and 6 are 1, matching winningCombos[7]

我的问题是:

Javascript 中执行此操作的方式是什么(可能使用 ES6)?

到目前为止,我想出的是:

const win = [[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 board = [null,null,1,0,1,0,1,null,0];

let score = [];

board.forEach(function(cell, index) 
    {
      if(cell === 1) 
        score.push(index);
});
console.log(score);
console.log(win.indexOf(score) > -1)

但是我很难在数组数组中找到数组。尽管is和这个确切的数组存在于 中,但它并没有出现在结果中,因为我假设对象相等在 Javascript 中的工作方式。score[2,4,6]win

简而言之,我正在尝试查看是否score存在于win

我找到了这个解决方案,但它似乎很hacky。有没有更好的方法来处理这个?

4

2 回答 2

4

您可以使用Array.prototype.some(),Array.prototype.every()来检查win,score

const win = [
  [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 board = [null, null, 1, 0, 1, 0, 1, null, 0];

let score = [];

board.forEach(function(cell, index) {
  if (cell === 1)
    score.push(index);
});
console.log(score);
let bool = win.some(function(arr) {
  return arr.every(function(prop, index) {
    return score[index] === prop
  })
});
console.log(bool);

于 2016-11-11T18:11:36.480 回答
1

使用 ES6,您可以将win数组映射到每个位置的实际值:

const win = [[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 board = [null,null,1,0,1,0,1,null,0];
let winning_spots = win.map((spots) => spots.map((i) => board[i]));
>>> winning_spots
[[null, null, 1], [0, 1, 0], [1, null, 0], [null, 0, 1], [null, 1, null], [1, 0, 0], [null, 1, 0], [1, 1, 1]]

然后我们可以过滤哪些具有全部 1 或 0:

let one_winners = winning_spots.filter((spots) => spots.every((e) => e == 1));
let zero_winners = winning_spots.filter((spots) => spots.every((e) => e == 0));
>>> one_winners
[[1, 1, 1]]
>>> zero_winners
[]

最后,如果我们想找出是否有赢家,只需检查长度:

let is_winner = (one_winners.length + zero_winners.length) > 0
于 2016-11-11T18:09:43.597 回答