我正在編程國際象棋引擎,以便在未來看到我必須更改棋盤配置并洗掉更改的部分簡而言之,問題是這個
function chessAi(){
let copy=[...board]
pisces.forEach(pisce=>{
pisce.forEach(move=>{
//play move on the board
//reset board to original board
board=copy
}
}
}
這只是行不通,我不知道為什么,但是我搞砸了,發現如果我像這樣在每一步都定義副本
function chessAi(){
pisces.forEach(pisce=>{
pisce.forEach(move=>{
let copy=[...board]
//play move on the board
//reset board to original board
board=copy
}
}
}
它完美地作業有人可以解釋為什么以及如何解決這個問題嗎?這需要大量的處理能力,并使計算變得更加困難。提前致謝
uj5u.com熱心網友回復:
pisce.forEach copy和的第一次迭代board后將參考相同的陣列。正如@vcodepro 提到的,一種方法是通過克隆副本來恢復電路板。另一種選擇是在每次迭代開始時克隆它,并在處理完成后將其丟棄:
function chessAi(){
let selectedConfig = null
pisces.forEach(pisce=>{
pisce.forEach(move=>{
newConfig = [...board]
//play move on the newConfig
//if the newConfig is appropriate
selectedConfig = newConfig
}
}
return selectedConfig
}
這樣,您就可以保持電路板的當前狀態不受任何修改的影響。否則,如果你想board在其他地方使用,并且這里已經修改,可能會導致難以發現錯誤。
uj5u.com熱心網友回復:
如果資料沒有嵌套,則擴展運算子會制作資料的深層副本。
這意味著當您在陣列中嵌套資料時,擴展運算子將創建最頂層資料的深層副本和嵌套資料的淺層副本。這就是當實際陣列發生變化時它會發生變化的原因。
讓我用一個例子來解釋:
// Original Array
let board = ['board1', 'board2',['board3','board4']];
// On copy this board data to a new variable via spread operator.
let copy = [...board];
// It looks like we get a deep copy of whole board array but in fact we don’t.
console.log(copy[0]) // 'board1'
console.log(copy[2][1]) // 'board4'
現在,如果我們更改保存在 的陣列index 2,copy[2][1]它不僅會更改變數“board”的資料,還會更改“copy”的資料。所以這意味著指向指向記憶體board[2][1]中的同一個陣列。copy[2][1]
這就是您的第二個解決方案起作用的原因,因為您在每次迭代后對每個嵌套陣列進行深度復制。
uj5u.com熱心網友回復:
在您的第一個代碼片段的第一次迭代中,您創建了一個board陣列的克隆(副本),但在第一次迭代之后和下一次迭代中,您正在處理您在第一次迭代中創建的同一個陣列,這就是您得到意外結果的原因。
但是在您的第二個代碼片段中,您將board在每次迭代中創建陣列的新克隆(副本)。
您的問題的解決方案可以使用board變數的克隆(副本)重置copy變數:
function chessAi(){
let copy=[...board]
pisces.forEach(pisce=>{
pisce.forEach(move=>{
//play move on the board
//reset board to original board
board=[...copy]
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/456879.html
標籤:javascript 数组 for循环 前锋
上一篇:如何創建非阻塞回圈JS?
