为什么当我把轨迹推到数组时,数组中的所有元素都发生了变化



我试图解决leetcode 46。JS中的置换,但下面的代码得到了错误的结果,但当使用res.push([...track])而不是res.push(track)时将是正确的。我对此感到困惑,在我看来这两者是一样的。非常感谢。

var permute = function(nums) {
const res = []
backtrack(res, [], nums)

return res
};
var backtrack = function(res, track, nums) {
if (track.length == nums.length) {
console.log('track: ', track)
console.log('res: ', res)
console.log()
res.push(track)
//res.push([...track])
return 
}

for (let i = 0; i < nums.length; i++) {
if (track.includes(nums[i])) continue      
track.push(nums[i])
backtrack(res, track, nums)
track.pop()
}
}
const res = permute([1,2,3])
console.log(res)

由于res.push(track),这将跟踪数组的引用保留在res数组中。当你改变轨迹后,res数组也会改变。所以,您需要通过执行[...track]来使用track中的项创建一个新数组。例如,

let res = [];
let track = [1,2,3];
res.push(track);
track.push(4);
console.log(track); // [1,2,3,4]
console.log(res); //[1,2,3,4]

res = [];
track = [1,2,3];
res.push([...track]);
track.push(4);
console.log(track); // [1,2,3,4]
console.log(res); //[1,2,3]

最新更新