Javascript Array.push正在推送一个空数组,而不是我传递给它的完整数组

Javascript Array.push正在推送一个空数组,而不是我传递给它的完整数组,javascript,debugging,Javascript,Debugging,我正在为爬楼梯算法写一个解决方案。 提示具体如下: 你需要爬一个有n级台阶的楼梯,你决定通过跳上台阶来获得额外的锻炼。一次跳跃最多可跨k步。返回所有可能的跳跃顺序,你可以爬楼梯,分类 我的代码工作-我使用回溯,它应该以正确的顺序出现,除了。。。每当我将一个解决方案推送到应答数组中时,就会推送一个空数组。我记录了控制台日志以查看哪些内容被推送到了我的数组中,它是一个具有正确值的完整数组。我无法理解这是怎么发生的。这是我的密码: function climbingStaircase(n, k) {

我正在为爬楼梯算法写一个解决方案。 提示具体如下:

你需要爬一个有n级台阶的楼梯,你决定通过跳上台阶来获得额外的锻炼。一次跳跃最多可跨k步。返回所有可能的跳跃顺序,你可以爬楼梯,分类

我的代码工作-我使用回溯,它应该以正确的顺序出现,除了。。。每当我将一个解决方案推送到应答数组中时,就会推送一个空数组。我记录了控制台日志以查看哪些内容被推送到了我的数组中,它是一个具有正确值的完整数组。我无法理解这是怎么发生的。这是我的密码:

function climbingStaircase(n, k) {
  const solutions = [];

  const findSolution = (progressArray, k, remaining) => {
      if (remaining === 0) {
          console.log('pA:', progressArray)
          solutions.push(progressArray);
          return;
      } else {
          for (let i = 1; i <= k; i++){
             if (i <= remaining) {
                progressArray.push(i);
                findSolution(progressArray, k, remaining - i);
                progressArray.pop();
              }
          }
      }
  }
  findSolution([], k, n);
  console.log('final solutions', solutions)
}
我尝试分配临时变量,以确保它始终引用正确的数组。我已经尝试将我的解决方案数组作为参数传入。。。所有这些似乎都不必要,但仍然返回相同的结果。我知道这是一个小东西,会让我翻白眼,但我看不见它。请提供帮助。

您的代码在整个过程中使用一个数组,并弹出它推送到该数组中的所有条目。在保存到解决方案时,您可能希望保存阵列的副本:

实例:

函数攀爬楼梯,k{ 常数解=[]; 常量findSolution=progressArray,k,剩余=>{ 如果剩余===0{ console.log'pA:',progressArray solutions.pushprogressArray.slice; 回来 }否则{ 对于let i=1;i您的代码在整个过程中使用一个数组,并弹出它推送到该数组中的所有条目。您可能希望在保存到解决方案时保存该数组的副本:

实例:

函数攀爬楼梯,k{ 常数解=[]; 常量findSolution=progressArray,k,剩余=>{ 如果剩余===0{ console.log'pA:',progressArray solutions.pushprogressArray.slice; 回来 }否则{ 对于let i=1;i将solutions.pushprogressArray;替换为solutions.pushprogressArray.slice

您将progressArray传递到您的函数中,然后对其进行变异。但由于这始终是对progressArray的相同引用,因此您将对同一数组进行变异。最终,progressArray.pop;将删除所有元素,并最终得到五倍于相同空数组的数组

.slice创建数组的副本。

将solutions.pushprogressArray;替换为solutions.pushprogressArray.slice

您将progressArray传递到您的函数中,然后对其进行变异。但由于这始终是对progressArray的相同引用,因此您将对同一数组进行变异。最终,progressArray.pop;将删除所有元素,并最终得到五倍于相同空数组的数组


.slice创建数组的副本。

谢谢。我有一种预感,这是一种类似的东西。我甚至用另一个名称创建了一个数组的“副本”,忽略了数组是通过引用传递的,我需要创建一个新的数组作为副本。谢谢。我有一种预感,这是一种类似的东西。我甚至用另一个名称创建了一个数组的“副本”,忽略了数组是通过引用传递的,我需要创建一个新的数组作为副本。
pA: [ 1, 1, 1, 1 ]
pA: [ 1, 1, 2 ]
pA: [ 1, 2, 1 ]
pA: [ 2, 1, 1 ]
pA: [ 2, 2 ]
final solutions [ [], [], [], [], [] ]
solutions.push(progressArray.slice());
// -------------------------^^^^^^^^