Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript数组值在被推送后正在更改_Javascript_Arrays - Fatal编程技术网

javascript数组值在被推送后正在更改

javascript数组值在被推送后正在更改,javascript,arrays,Javascript,Arrays,我正在尝试调试下面的代码 它应该创建一个2d数组,包含输入字符串的所有排列 开始时非常好,初始字符串被推送到数组中,但在我运行步骤4中的reverse函数后,strArr中的值从长度3变为长度2。基本上就像在reverse函数中跳过concat一样,但是当我在调试器中运行它时,z在concat之后的长度是3,但是当函数返回它时,长度再次变为2 任何帮助都将不胜感激 function permAlone(str) { var perms = []; var totalPerms = fac

我正在尝试调试下面的代码

它应该创建一个2d数组,包含输入字符串的所有排列

开始时非常好,初始字符串被推送到数组中,但在我运行步骤4中的reverse函数后,strArr中的值从长度3变为长度2。基本上就像在reverse函数中跳过concat一样,但是当我在调试器中运行它时,z在concat之后的长度是3,但是当函数返回它时,长度再次变为2

任何帮助都将不胜感激

function permAlone(str) {
  var perms = [];
  var totalPerms = factorial(str.length);
  var strCodes = converter(str);
  var strArr = [];
  strArr.push(strCodes);
  // overall loop
  for (var X = 0; X < totalPerms; X++) {

    //step 1
    var largestI = -1;
    for (var i = 0; i < strCodes.length - 1; i++) {
      if (strCodes[i] < strCodes[i + 1]) {
        largestI = i;
      }
    }
    //if none found break loop
    if (largestI == -1) {
      break;
    }

    //step 2
    var largestJ = -1;
    for (var j = 0; j < strCodes.length; j++) {
      if (strCodes[largestI] < strCodes[j]) {
        largestJ = j;
      }
    }

    //step 3
    swap(strCodes, largestI, largestJ);

    //step 4
    strCodes = reverse(strCodes, largestI);

    //step 5 push to array
    strArr.push(strCodes);
  }
  console.log(strArr);
  return strArr;
}

function factorial(x) {
  for (var i = x - 1; i > 0; i--) {
    x *= i;
  }
  return x;
}

function converter(x) {
  var temp = [];
  for (var i = 0; i < x.length; i++) {
    temp.push(x.charCodeAt(i));
  }
  return temp;
}

function swap(a, i, j) {
  var temp = a[i];
  a[i] = a[j];
  a[j] = temp;
}

function reverse(z, a) {
  var endArr = z.splice(a+1);
  endArr.reverse();
  z = z.concat(endArr);
  return z;
}

debugger;
permAlone('abc');
函数permolone(str){
var perms=[];
var totalPerms=阶乘(str.length);
var STRCODE=转换器(str);
var-strArr=[];
strArr.push(strcode);
//总回路
对于(var X=0;X0;i--){
x*=i;
}
返回x;
}
功能转换器(x){
var-temp=[];
对于(变量i=0;i
反向函数返回一个新数组,不处理现有数组。您需要将代码更改为以下内容:

endArr = endArr.reverse();

看起来这是阵列的浅拷贝问题


我添加了z=z.slice();到反向功能,它解决了问题。

我尝试了这个,但仍然有相同的问题。mdn引用还说,reverse函数在适当的位置改变了数组,所以我认为它影响了实际数组,并在不再次设置变量的情况下对其进行了更新。也许我还需要重新温习一下我的嘀咕:)reverse确实会改变现有的数组——当你怀疑它是反向的时候。
reverse
函数不返回新数组,而是操作现有数组。我感觉这与变量的浅拷贝和深拷贝有关。我现在正在运行一些测试,如果我弄明白了,我会发布一个答案。