- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我写了下面这个 JS 程序来解决 N-queen 问题,它运行良好。但后来我试图用特定格式修改输出。然后我观察到一个奇怪的问题。
如果您查看下面的代码,在函数“findSolution”中,我正在传递一个数组 - “board”。然后我在这一行中复制这个数组 -
let boardCp=board.slice(); //Board is an array of arrays (idea is to never modify the original board object)
然后将此副本传递给另一个函数进行修改。当该函数修改此副本时,原始数组(在本例中为“board”)应保持不变 - 对吗?但令人惊讶的是,我看到原始数组也在被修改。
有人可以帮我理解为什么会这样吗?如果我需要提供更多详细信息,请告诉我。
var solveNQueens=function(A)
{
var retArr=[];
var board=[];
for(var i=0;i<A;i++)
{
var row=[];
for(var j=0;j<A;j++)
{row.push('.');}
board.push(row);
}
findSolution(board.slice(),A,0,{},retArr);
return retArr;
}
var findSolution=function(board,boardSize,rowNum,queenpositions,retArr)
{
for(var j=0;j<boardSize;j++)
{
if(rowNum==0)
queenpositions={};
if(isSafeToPlace(rowNum,j,queenpositions))
{
var foundSolutionsToOtherQueens=true;
queenpositions[rowNum]=j;
var nextRowNum=rowNum+1;
if(nextRowNum<boardSize)
foundSolutionsToOtherQueens=findSolution(board,boardSize,nextRowNum,Object.assign({},queenpositions),retArr);
else
{
debugger;
let boardCp=board.slice();
retArr.push(convertQueenPositionToArray(boardCp,queenpositions));
}
if(!foundSolutionsToOtherQueens)
delete queenpositions[rowNum];
}
}
return false;
}
var convertQueenPositionToArray=function(boardCp,queenpositions)
{
for(var i=0;i<boardCp.length;i++)
{
var row=boardCp[i];
for(var j=0;j<row.length;j++)
{
if(queenpositions.hasOwnProperty(i) && j==queenpositions[i])
row[j]='Q';
}
}
return boardCp;
}
var isSafeToPlace=function(rowNum,j,existingQueenpositions)
{
for(var prop in existingQueenpositions)
{
var colmn=existingQueenpositions[prop];
if(colmn===j || colmn==(j-(rowNum-prop)) || colmn==(j+(rowNum-prop)))
return false;
}
return true;
}
最佳答案
slice
方法不进行深度复制。
它只复制数组的第一层(仅字符串和数字)。
让我们考虑下面的例子:
const nestedArray = [
1,
[2, 3],
{ y1: 4, y2: 5},
];
const cloneArray = nestedArray.slice();
// this is safe
cloneArray[0] = 'new value 1';
console.log(nestedArray[0]); // expect 1
// cloneArray[1] is a pointer to the original array
cloneArray[1][0] = 'new value 2';
console.log(nestedArray[1]); // expect 2, got 'new value 2'
// cloneArray[2] s a pointer to the original object
cloneArray[2].y1 = 'new value 4';
console.log(nestedArray[2]); // expect { y1: 4, y2: 5}, got { y1: 'new value 4', y2: 5}
如果您需要对嵌套数组或对象进行深拷贝,您必须递归地进行或使用第三方库,例如 lodash:var cloneArray = _。 cloneDeep(嵌套数组)
另一个捷径解决方案是执行 JSON.parse(JSON.stingify(nestedArray))
关于javascript Slice 没有做浅拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49290042/
免责声明 这篇文章是关于术语“浅拷贝”和“深拷贝”的正确用法,特别是在谈论复制一个不包含任何引用的对象时。这个问题并不意味着(也不应该)基于意见,除非真的没有关于这个话题的共识。我已将此问题标记为 C
我有这个功能 int getrelation(string name, RELATION& output){ bool found=0; int index=0;
与 why should I make a copy of a data frame in pandas 有关 我注意到在流行的backtesting图书馆, def __init__(self, d
我的问题很基础,但我想 100% 理解所有内容。 SO中的很多问题都引用了我的帖子,但我没有找到满意的答案。 我们知道java中的枚举是引用类型。让我们考虑以下片段: public static cl
请引用这个 fiddle 的问题。 http://jsfiddle.net/AQR55/ 1)为什么附加到隔离范围属性的 watch - 双向绑定(bind)到父属性,不会在更改父范围属性时触发。 在
我想使用 UP3 来完成一项非常具体的任务,我应该能够使用 API 来实现该任务。我想了解是否可以编写以下应用程序。 基于https://jawbone.com/support/articles/00
如何在辅助方法中传递上下文并提取数据? 请参阅以下代码片段: import AppContext from '../../context/AppContext' import extractDatta
我正在尝试使用 simple-git 创建浅克隆。我正在尝试创建与此命令等效的命令:git clone --depth 1 https://github.com/steveukx/git-js.git
我是一名优秀的程序员,十分优秀!