javascript数组值在被推送后正在更改
我正在尝试调试下面的代码 它应该创建一个2d数组,包含输入字符串的所有排列 开始时非常好,初始字符串被推送到数组中,但在我运行步骤4中的reverse函数后,strArr中的值从长度3变为长度2。基本上就像在reverse函数中跳过concat一样,但是当我在调试器中运行它时,z在concat之后的长度是3,但是当函数返回它时,长度再次变为2 任何帮助都将不胜感激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
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
函数不返回新数组,而是操作现有数组。我感觉这与变量的浅拷贝和深拷贝有关。我现在正在运行一些测试,如果我弄明白了,我会发布一个答案。