Javascript:在数组数组中搜索数组
我正在寻找在数组数组中搜索包含给定数组元素的数组实例的最佳方法 现在,我明白这是一条令人困惑的线。下面是一个例子来说明这个场景 我有一个搜索集,它是一个包含9个项目的数组,代表一个包含9个单元格的游戏板。值可以是Javascript:在数组数组中搜索数组,javascript,arrays,search,arrayofarrays,Javascript,Arrays,Search,Arrayofarrays,我正在寻找在数组数组中搜索包含给定数组元素的数组实例的最佳方法 现在,我明白这是一条令人困惑的线。下面是一个例子来说明这个场景 我有一个搜索集,它是一个包含9个项目的数组,代表一个包含9个单元格的游戏板。值可以是1、0或null: 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
1
、0
或null
:
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
中的每个数组表示板
数组中的索引,它们是获胜的组合
共有8个获胜组合
每个获胜的组合是一组3个指数,如果它们的值都为1,则将获胜
i、 e.为了获胜,董事会可以:
board = [1,1,1,0,0,0,null,null,0]; // Index 0,1, and 2 are 1, matching winningCombos[0]
或
我的问题是:
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];
设board=[null,null,1,0,1,0,1,null,0];
让分数=[];
board.forEach(功能(单元、索引)
{
如果(单元格==1)
得分。推(指数);
});
控制台日志(score);
console.log(win.indexOf(score)>-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
使用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
您可以使用
Array.prototype.some()
,Array.prototype.each()
检查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]
];
让board=[null,null,1,0,1,0,1,null,0];
让分数=[];
board.forEach(功能(单元、索引){
如果(单元格==1)
得分。推(指数);
});
控制台日志(score);
让bool=win.some(函数(arr){
返回arr.every(函数(属性、索引){
返回分数[索引]==道具
})
});
控制台日志(bool)
您可以使用Array.prototype.some()
,Array.prototype.each()
来检查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]
];
让board=[null,null,1,0,1,0,1,null,0];
让分数=[];
board.forEach(功能(单元、索引){
如果(单元格==1)
得分。推(指数);
});
控制台日志(score);
让bool=win.some(函数(arr){
返回arr.every(函数(属性、索引){
返回分数[索引]==道具
})
});
控制台日志(bool)代码>板阵列如何对应于win
阵列?为什么在win
有八个索引,长度.length
为8
,在board
有九个索引,长度.length
为9
?我理解了board和winning combo,但很难弄清楚你到底想计算什么。你想知道win中是否有分数吗?@guest271314:棋盘数组是由9个单元格组成的数组。win数组是所有可能的3个单元格组合的索引数组,当它们的值为1时,它们将获胜。我将把这个问题补充为well@skav对简言之,是的。我将把这一点添加到下面的问题中,并给出很好的答案-但是如果您想要一个数组相等的常规例程,请参见:板数组如何对应赢数组?为什么在win
有八个索引,长度.length
为8
,在board
有九个索引,长度.length
为9
?我理解了board和winning combo,但很难弄清楚你到底想计算什么。你想知道win中是否有分数吗?@guest271314:棋盘数组是由9个单元格组成的数组。win数组是所有可能的3个单元格组合的索引数组,当它们的值为1时,它们将获胜。我将把这个问题补充为well@skav对简言之,是的。我将把它添加到下面的问题中,并给出很好的答案——但如果您想要一个数组相等的常规例程,请参见:Beautiful。谢谢我不知道。有些和。每个都存在。我想如果你能把你的答案也添加到相关的问题上,那就太好了。这比答案更清晰。我刚想发布我的答案,但后来我看到了这个。“做得很好!”nikjohn在链接问题中添加了描述模式的答案。很漂亮。谢谢我不知道。有些和。每个都存在。我想如果你能把你的答案也添加到相关的问题上,那就太好了。这比答案更清晰。我刚想发布我的答案,但后来我看到了这个。“做得很好!”nikjohn在链接问题中添加了描述模式的答案。