将意外值推送到数组

时间:2016-02-15 21:36:08

标签: javascript arrays algorithm

我正在尝试推进阵列时,我相信这是一种奇怪的行为。我在输出数组时看到了预期的值。如果我按下阵列然后输出,我会得到重复的值。有问题的代码:

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任务,我正在努力寻找不重复的排列。

1 个答案:

答案 0 :(得分:1)

您正在使用相同的数组变量,该变量始终引用相同的内存位置。因此,无论您在该数组中进行哪些更改,都会更改,无论您是通过数组还是通过置换访问数组,其所有元素都设置为相同的数组引用。< / p>

您可以通过将数组的副本添加到 permutations 数组来解决此问题,如下所示:

permutations.push(array.slice(0)); 

请注意,数组值包含字符串。如果它们是您也修改过的可变对象,那么您需要进一步扩展此解决方案。但在你的情况下,上述就足够了。