今天在做 LeetCode Path Sum II 的时候遇到一个数组浅复制的问题,一个数组保存节点的临时状态,在满足条件的情况下将其存放在结果数组中,有问题的代码如下:

1
2
3
4
5
6
7
8
9
10
const result = []
const current = [1,2,3,4]
//将 current 保存在 result 中
result.push(current)
//打印 result
console.log(result) // [[1,2,3,4]]
//修改 current
current.pop()
//再次打印 result
console.log(result) // [[1,2,3]]

考虑到 current 数组中都是基本数据类型,可以进行浅拷贝复制:(将 result.push(current) 用以下代码替换)

方式一:额外申请一个数组保存 current 的值

1
2
3
4
5
let tmp = []
//将 current 保存在 tmp 中
for(let i=0;i<current.length;i++){
tmp.push(current[i])
}

方式二:用 array.slice 进行浅拷贝

1
result.push(current.slice(0))

另:如果 current 数组中有引用数据类型,引用数据类型中又有引用数据类型,深度拷贝则需要递归的对数组中每一项进行拷贝,直到数据类型是基本数据类型!