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

时间:2017-09-09 12:03:06

标签: javascript arrays

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

应该创建一个二维数组,其中包含输入字符串的所有排列。

它开始很好,并且初始字符串被推送到数组,但是在我在步骤4中运行反向函数之后,strArr中的值从长度3变为长度2.基本上就像它是在反向函数中跳过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');

2 个答案:

答案 0 :(得分:0)

reverse函数返回一个新数组,不会操作现有数组。您需要将代码更改为以下内容:

endArr = endArr.reverse();

答案 1 :(得分:0)

看起来像是一个浅层副本的问题。

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