javascript - 意外值被插入数组

标签 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' ] [ '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/

相关文章:

javascript - 数字和小数值的 Angular 2 自定义验证

javascript - JQuery如何在按下按钮时运行脚本

javascript - 如果调用是在 AJAX 中进行的,如何检测并仅允许特定的 url 访问 Flask API?

c - char name[11]; 之间有什么区别?和字符*名称;

c# - 动态大小的数据插值

java - 如何找到响应中的最大值?

javascript - 如何判断内联对象标签是否已加载其数据

c++ - 查找数组的最低元素

java - 给定一个由 0 和 1 组成的二进制矩阵。找出最长的 1 序列,无论是行式还是列式。 JAVA

php mysql 从数组项插入