JavaScript中将数组push进数组后外部打印存储值全部消失问题
问题原因
JavaScript 中数组是引用类型,你代码中每次调用res.push(temp)时,实际存入res的是temp数组的内存引用,而非当前temp数组的值副本。
后续递归回溯过程中你持续对temp执行push、pop操作修改同一个数组对象,递归完全执行结束后temp会被清空为[],res中存储的所有引用最终都指向这个空数组,所以外部打印时看到全是空数组。
你执行过程中打印res看起来结果正常,只是因为打印那一刻temp刚好是当前生成的排列值,本质上res里的所有元素从始至终都指向同一个temp数组,你贴的执行日志里比如第二次输出[ [ 1, 3 ], [ 1, 3 ] ]其实已经暴露出问题了,正确的中间结果应该是[[1,2],[1,3]]才对。
解决方法
只需要修改往res中存值的逻辑,存入temp的浅拷贝副本即可,避免所有元素指向同一个引用:
把你代码里的
res.push(temp);
替换为
// 两种写法选一种即可,都是生成当前temp的浅拷贝数组 res.push([...temp]); // 或者 res.push(temp.slice());
修改后的完整可运行代码:
var res = []; var temp = []; function Permutations(target, size) { if (size === 0) { // 存入temp的副本,而非原引用 res.push([...temp]); console.log(res); return; } for (let i = 0; i < target.length; i++) { if (target[i] !== null) { temp.push(target[i]); target[i] = null; Permutations(target, size - 1); target[i] = temp.pop(); } } } Permutations([1, 2, 3], 2); console.log(res); // 最终输出 [[1,2],[1,3],[2,1],[2,3],[3,1],[3,2]]
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

