【问题标题】:why when I push the track to array, all the elements in array changed为什么当我将轨道推到数组时,数组中的所有元素都改变了
【发布时间】:2020-12-17 06:06:22
【问题描述】:

我尝试解决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)

【问题讨论】:

  • 执行[...track]将轨道数组的副本推送到res,仅推送track会推送track的引用,这意味着res内的每个track都在引用到内存中的同一个数组
  • 顺便说一句,您在这里做了一些标榜惯例/最佳实践的事情:1) 省略分号,2) 将 varlet/const 混合到代码中,和 3) 将带有 function 声明的匿名函数分配给命名变量(更惯用的替代方法是使用命名函数或分配 lambda/fat-arrow 函数 (() =&gt; {})

标签: javascript push destructuring


【解决方案1】:

因为res.push(track) 这将轨道数组的引用保留在 res 数组中。当你改变轨道之后 res 数组也会改变。所以你需要通过[...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]

【讨论】:

    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 2021-03-07
    • 2020-07-08
    相关资源
    最近更新 更多