javascript数组push非空数组,而后console.log显示,push的数组为空数组

我这里有javascript实现时的问题,这里是想用递归的方法找到[1,2]的所有排列,我将probabilitys和probability都用var来声明,但是probabilitys在push操作时并没有达到预期,同时probability却正常工作:


```javascript
/**
 * @param {number} batchSize
 * @param {number[]} groups
 * @return {number}
 */
var currentGroups;
var probabilitys = [];
var probability = [];
function assembly(groups){
    let nextgroups;
    if(groups.length==0){
        // console.log(probability);// [1,2] [2,1]
        probabilitys.push(probability);
        console.log(probabilitys);// 在本地浏览器打开console显示[[]] , [[],[]] ; 在leetcode测试显示[[1,2]] ,
        // [[2,1],[2,1]]
        probability.pop();    
        return;
    }
    for(let item of groups){
        probability.push(item);
        nextgroups = groups;
        nextgroups = nextgroups.filter(it => it!=item);
        assembly(nextgroups)
    }
    probability.pop();
    return;
}

var maxHappyGroups = function(batchSize, groups) {
    currentGroups = groups;
    probabilitys = []//清空上一次的
    assembly(groups)
    // console.log(probabilitys);// [[],[]]
};

```

引用 皆我百晓生 小程序回复内容作答:

问题出在数组push操作时,对数组的引用进行了添加,而不是添加其副本。这导致在后续修改probability数组时,之前已经push的内容也被修改了。

为了解决这个问题,可以在push操作时使用数组的slice方法来创建副本。修改代码如下:

/**
 * @param {number} batchSize
 * @param {number[]} groups
 * @return {number}
 */
var currentGroups;
var probabilitys = [];
var probability = [];
function assembly(groups){
    let nextGroups;
    if(groups.length==0){
        probabilitys.push(probability.slice()); // 利用slice创建副本
        console.log(probabilitys);
        probability.pop();
        return;
    }
    for(let item of groups){
        probability.push(item);
        nextgroups = groups;
        nextgroups = nextgroups.filter(it => it != item);
        assembly(nextgroups);
    }
    probability.pop();
    return;
}
 
var maxHappyGroups = function(batchSize, groups) {
    currentGroups = groups;
    probabilitys = [];
    assembly(groups);
};

现在,对probability数组进行修改时,不会影响之前已经push到probabilitys中的内容。在console.log输出时,你会看到正确的结果。