Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Javascript中存储变量的上一个值?_Javascript_Variables - Fatal编程技术网

如何在Javascript中存储变量的上一个值?

如何在Javascript中存储变量的上一个值?,javascript,variables,Javascript,Variables,在我的一个项目中,我有一段错误代码。函数makeMove更新全局变量板,函数takeMove重置板。当线路板被改变时,我将线路板值放入一个数组中,然后重置线路板。问题是,当我访问此阵列时,其中存储的板值是重置板的值,而我需要阵列中更新板的值 我尝试过浅层复制更新后的电路板,然后将其存储,但这不起作用,我没有深度复制阵列,因为我将使用此代码进行数千次迭代,深度复制可能会占用大量性能 以下是代码片段: 让董事会=[ [C,H,B,Q,K,B,H,C], [P,P,P,P,P,P,P,P,P,P],

在我的一个项目中,我有一段错误代码。函数makeMove更新全局变量板,函数takeMove重置板。当线路板被改变时,我将线路板值放入一个数组中,然后重置线路板。问题是,当我访问此阵列时,其中存储的板值是重置板的值,而我需要阵列中更新板的值

我尝试过浅层复制更新后的电路板,然后将其存储,但这不起作用,我没有深度复制阵列,因为我将使用此代码进行数千次迭代,深度复制可能会占用大量性能

以下是代码片段:

让董事会=[ [C,H,B,Q,K,B,H,C], [P,P,P,P,P,P,P,P,P,P], [ , , , , , , , ], [ , , , , , , , ], [ , , , , , , , ], [ , , , , , , , ], [p,p,p,p,p,p,p,p,p,p], [c,h,b,q,k,b,h,c] ]; 函数makeMovefrom、to{ let piece=板[from.y][from.x]; 线路板[from.y][from.x]=; pieceBeforeOnToSQ=板[to.y][to.x]; 板[to.y][to.x]=件; } 函数takeMovefrom,to{ let piece=板[to.y][to.x]; 板[to.y][to.x]=件前件SQ; 板[from.y][from.x]=件; } 移动位置{ x:索引%8, y:Math.floorindex/8 }; 伪legalnodelist.pushboard; 采取行动{ x:索引%8, y:Math.floorindex/8 }; 注意:变量pieceBeforeOnToSQ是全局变量


如果您需要有关问题或代码的任何澄清,请随时提问。

为什么不将最后一个值与索引一起存储,如

[x, y, value]
并将数组中的最后一个值与位置一起保留


如果要向后走,请从数组末尾获取值及其位置,并获得一块具有特定后退步数的板。

我建议您实现如下代码:

让我们移动=[]; 函数初始状态{ 返回[ [C,H,B,Q,K,B,H,C], [P,P,P,P,P,P,P,P,P,P], [ , , , , , , , ], [ , , , , , , , ], [ , , , , , , , ], [ , , , , , , , ], [p,p,p,p,p,p,p,p,p,p], [c,h,b,q,k,b,h,c] ]; } 函数当前状态{ const board=初始状态; moves.foreach函数move{ const currentPiece=线路板[move.from.y][move.from.x]; 板[move.from.y][move.from.x]=; 线路板[move.to.y][move.to.x]=当前件; }; 返回板; } 函数makeMovemove{ moves.pushmove; } 函数undoMovesamountOfMoves{ moves=moves.slice0,-1*amountOfMoves; } 临时行动{ 发件人:{ x:0,, y:1 }, 致:{ x:0,, y:2 } }; 要进行移动,将向移动数组中添加新的移动。
要撤消一个或多个移动,您可以调用undoMoves。

我建议您保留一个历史记录数组,在该数组中,您可以在执行移动之前,推送板的受影响字段中的状态

回放/撤消历史记录时,可以通过将这些状态从阵列中弹出并将这些字段恢复为原始状态来恢复这些状态

此方法与的方法相比的优点是,使用此方法,您还可以建立所做动作的历史记录,并且您可以在以后分析该动作,而不必过滤出哪些动作是特别从整个电路板中进行的

请参见下面的示例。您可以通过在文本字段中编辑json并点击reload来展开所需的移动

函数getOriginalBoard{return[ [C,H,B,Q,K,B,H,C], [P,P,P,P,P,P,P,P,P,P], [ , , , , , , , ], [ , , , , , , , ], [ , , , , , , , ], [ , , , , , , , ], [p,p,p,p,p,p,p,p,p,p], [c,h,b,q,k,b,h,c] ] }; let board=getOriginalBoard; 让历史=[ ]; 函数makeHistoryEntryfrom,to{ 历史推送{ 发件人:{ 地点:从, 值:板[from.y][from.x] }, 致:{ 地点:至, 价值:板[to.y][to.x] } }; } 函数倒带{ ifhistory.length>0{ 让previousState=history.pop; let from=先前的状态。from; 线路板[from.location.y][from.location.x]=from.value; let to=previousState.to; 板[to.location.y][to.location.x]=to.value; 伦德菲尔德; } } 函数makeMovefrom、to{ makeHistoryEntryfrom、to; let piece=板[from.y][from.x]; 线路板[from.y][from.x]=; 板[to.y][to.x]=件; 伦德菲尔德; } 函数渲染场{ let play=document.getElementById'play'; 让内容=[]; content.push'Y-'+[…阵列板[0].长度].join-- forlet i=0;i{ 让我们移动=移动.shift; 伊夫莫夫{ makeMovemove.from,move.to; }否则{window.alert不再移动;} }; getElementById“倒带”。addEventListener“单击”,倒带; document.getElementById'reload'。addEventListener'click',e=>{ moves=JSON.parsemovesElement.value; 历史=[]; 董事会=原始董事会; 伦德菲尔德; }; 伦德菲尔德; 玩{ 背景:333人; 颜色:eee; 字号:800; 填充:12px; 显示:内联块; } 移动{ 宽度:300px; 高度:200px; } 重新加载 下一步 打开 [ {from:{x:7,y:7},to:{x:6,y:5}, {from:{x:0,y:0},to:{x:0,y:3}, {from:{x:1,y:0},to:{x:1,y:4}, {from:{x:0,y:6},to:{x:0,y:3} ]
您是否考虑过存储历史记录?i、 e.pieceBeforeOnToSQ.push{x:0,y:0,value:1}@nickzoum,我认为跟踪历史的问题在于,你无法有效地确定应该放回什么“已拍摄”的片段,除非你再次迭代完整的历史。@Titulum一旦撤消,你只需要检查最后一项。如果你想完全重置电路板,你必须撤销所有的更改。这就是它在大多数程序中的工作原理。为了澄清,您需要知道变量的前一个值;2.你不想复印一份吗?如果我理解你的话,这些看起来是矛盾的。当你想在每一个动作上创建一个新的数组时,你可以考虑使用更好的性能。