2016-11-11 56 views
0

我正在尋找最佳方法來搜索包含給定數組的元素的數組的實例,該數組是一個數組數組。Javascript:搜索數組中的數組

現在,我明白這是一個混亂的線。所以這裏有一個例子來說明這個場景。

我有一個搜索集,其中有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中的對象相等方式起作用。

概括地說,我想看看是否存在win

score我發現this的解決方案,但它似乎很哈克。有沒有更好的方法來處理這個問題?

+0

如何'board'陣列對應'win'陣列?爲什麼'win'有八個索引,'.'長度是'8',在'board'有九個索引,'.length'是'9'? – guest271314

+0

我承諾董事會和贏得Combos,但麻煩搞清楚你到底想要計算什麼。你試圖找出勝利中是否存在分數? – skav

+0

@ guest271314:電路板陣列是由9個電池組成的陣列。 win數組是所有可能的3個單元格組合中的一個數組,當它們的值爲1時,它們將贏得勝利。我還會將此添加到該問題中 – nikjohn

回答

2

您可以使用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);

+0

美麗。謝謝。我不知道'.some'和'.every'存在。我認爲如果你可以在鏈接問題上添加你的答案,那將會很棒。它比現在的答案更清潔。 – nikjohn

+0

即將發佈我的答案,但後來我看到了這一點。做得很好。 – Gavin

+1

@nikjohn在鏈接的問題中添加了描述模式的答案。 – guest271314

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