我正在尝试推进阵列时,我相信这是一种奇怪的行为。我在输出数组时看到了预期的值。如果我按下阵列然后输出,我会得到重复的值。有问题的代码:
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','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任务,我正在努力寻找不重复的排列。
答案 0 :(得分:1)
您正在使用相同的数组变量,该变量始终引用相同的内存位置。因此,无论您在该数组中进行哪些更改,都会更改,无论您是通过数组还是通过置换访问数组,其所有元素都设置为相同的数组引用。< / p>
您可以通过将数组的副本添加到 permutations 数组来解决此问题,如下所示:
permutations.push(array.slice(0));
请注意,数组值包含字符串。如果它们是您也修改过的可变对象,那么您需要进一步扩展此解决方案。但在你的情况下,上述就足够了。