我认为在尝试插入数组时出现了奇怪的行为。输出数组时我看到了预期值。如果我插入数组然后输出,我会得到重复的值。有问题的代码:
var test = "aab";
testA = test.split("");
permutations = [];
generatePermutations(testA, testA.length);
function generatePermutations(array, arrayLength) {
if (arrayLength === 1) {
console.log(array); // THIS OUTPUTS DIFFERENT PERMUTATIONS
permutations.push(array);
console.log(permutations); // VALUES IN ARRAY ARE ALL THE SAME
/*
permutations.push(array.join(""));
console.log(permutations);
SPLITTING THE STRING MAKES IT WORK FINE?!
*/
return;
}
for (var i = 0; i < arrayLength; i += 1) {
generatePermutations(array, arrayLength - 1);
if (arrayLength % 2 == 0) {
swapArrayElements(array, i, arrayLength - 1);
} else {
swapArrayElements(array, 0, arrayLength - 1);
}
}
}
function swapArrayElements(array, elementA, elementB) {
var temp = array[elementA];
array[elementA] = array[elementB];
array[elementB] = temp;
}
console.log(array)
将按预期输出排列。它将在函数重复出现时输出所有排列:
[ 'a', 'a', 'b' ] [ 'a', 'a', 'b' ] [ 'b', 'a', 'a' ] [ 'a', 'b', 'a' ] [ 'a', 'b', 'a' ] [ 'b', 'a', 'a' ]
如果我将结果推送到另一个数组 permutations.push(array)
,每个元素都具有相同的值:
[ [ 'a', 'a', 'b' ], [ 'a', 'a', 'b' ], [ 'a', 'a', 'b' ], [ 'a', 'a', 'b' ], [ 'a', 'a', 'b' ], [ 'a', 'a', 'b' ] ]
如果我在将数组推送到排列时加入数组,我会得到预期的结果:`permutations.push(array.join("")):
[ 'aab', 'aab', 'baa', 'aba', 'aba', 'baa' ]
我在这里错过了什么?我无法理解数组如何包含一个在被插入排列时突然改变的值。
为清楚起见,这是一个 freecodecamp 任务,我正在努力寻找非重复排列。
最佳答案
您正在使用相同的数组 变量,它始终引用相同的内存位置。因此,无论您在该数组中更改什么,都会独立于您是通过 array 还是通过 permutations 访问数组,后者的所有元素都设置为相同的数组引用。
您可以通过将数组的副本添加到排列 数组来解决这个问题,如下所示:
permutations.push(array.slice(0));
请注意,您拥有的数组 值由字符串组成。如果它们是您也修改过的可变对象,那么您将需要进一步扩展此解决方案。但在你的情况下,以上就足够了。
关于javascript - 意外值被插入数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35419532/