递归推送仅添加最后一个元素

菲利普·伊格尔斯

我正在尝试创建一个函数,该函数针对给定的长度生成列表中元素的所有组合,并在2D列表中返回它们(例如,元素[1、2、3]和长度2的结果为[[1、1],[ 1,2],[1,3],[2,1],...]),但是在实现此功能时遇到问题。结果列表是正确的长度,但是列表中的所有项目都是找到的最后一个(因此,对于以上内容,我得到了[[3,3],[3,3],[3,3],...])。

我相信这是因为JavaScript不会立即推送,而只是推送到函数的末尾,因此对象已经发生了变异,但无法想出办法。我怎样才能立即推动它?

function combinationRecursive(maxLength, position, current, elements) {
    if (position >= maxLength) {
        combinations.push(current);
        return;
    }
    for (var i = 0; i < elements.length; i++) {
        current[position] = elements[i];
        combinationRecursive(maxLength, position + 1, current, elements);
    }
    return;
}

// example usage
combinations = [];
// max length 2 using 1,2,3 as described above
// the 0 and [] are the default starting parameters. I plan to add a wrapper function later
combinationRecursive(2, 0, [], [1,2,3]);
妮娜·斯科茨(Nina Scholz)

您将重复使用相同的数组,最后在结果的所有项目中都将获得相同的数组。

您可以推送具有相同对象引用的数组副本,而不是原始数组。

function combinationRecursive(maxLength, position, current, elements) {
    if (position >= maxLength) {
        combinations.push(current.slice());
        return;
    }
    for (var i = 0; i < elements.length; i++) {
        current[position] = elements[i];
        combinationRecursive(maxLength, position + 1, current, elements);
    }
}

// example usage
combinations = [];
// max length 2 using 1,2,3 as described above
// the 0 and [] are the default starting parameters. I plan to add a wrapper function later
combinationRecursive(2, 0, [], [1, 2, 3]);

console.log(combinations);
.as-console-wrapper { max-height: 100% !important; top: 0; }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章