【问题标题】:Javascript: Search for an array in an array of arraysJavascript:在数组数组中搜索数组
【发布时间】:2017-03-26 00:26:48
【问题描述】:

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

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

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

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)

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

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

我找到了this 解决方案,但它看起来很老套。有没有更好的方法来处理这个问题?

【问题讨论】:

  • board 数组如何对应win 数组?为什么win 有八个索引,8.lengthboard 有九个索引,9.length
  • 我了解 board 和winningCombos,但无法弄清楚您到底想要计算什么。您是否想弄清楚 win 中是否存在分数?
  • @guest271314:板阵列是一个由 9 个单元组成的阵列。获胜数组是所有可能获胜的 3 个单元格组合的索引数组,当它们的值为 1 时。我也会将此添加到问题中
  • @skav 是的。简而言之,是的。我也会将其添加到问题中
  • 下面的好答案 - 但如果你想要一个数组相等的通用例程,请参阅:stackoverflow.com/questions/7837456/…

标签: javascript arrays search arrayofarrays


【解决方案1】:

您可以使用Array.prototype.some()Array.prototype.every()检查winscore的每个元素

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

【讨论】:

  • 美丽。谢谢。我不知道 .some.every 存在。我认为如果您也可以将您的答案添加到链接的问题中,那就太好了。它比答案更干净。
  • 正要发布我的答案,但后来我看到了这个。做得很好。
  • @nikjohn 在链接的问题中添加了描述模式的答案。
【解决方案2】:

使用 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

【讨论】:

    猜你喜欢
    • 2011-09-12
    • 2015-07-02
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 2020-02-01
    • 2012-12-19
    • 1970-01-01
    相关资源
    最近更新 更多