gpt4 book ai didi

javascript Slice 没有做浅拷贝

转载 作者:行者123 更新时间:2023-11-30 14:43:41 25 4
gpt4 key购买 nike

我写了下面这个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com