使用自执行内部函数的JavaScript中的数组复制功能

时间:2014-03-27 18:33:07

标签: javascript

我正在尝试在JavaScript中编写一个数组复制函数,它将一个数组和一个复制因子作为输入参数,并返回该复制数组。

像这样:

expect(replicate([2,3,4],2).toEqual([2,3,4,2,3,4]));

我正在尝试使用递归调用的自执行内部函数来完成此操作,该函数应在完成时将所需值返回到外部函数。

内部功能似乎正常工作:

var replicate = function (inputArray, n) {
    var outputArray = [];
    return (function replicateInner(n) {
        if (n > 0) {
            outputArray.push(inputArray.slice(0));
            replicateInner(--n)
        } else {
            alert('inner function returns: ' + outputArray);
            //inner function returns: [2,3,4,2,3,4]
            return outputArray;
        }
    })(n);

 };

但是当我调用外部函数时,它返回undefined

alert(replicate([2,3,4],2)); // returns undefined, not [2,3,4,2,3,4]

知道我在这里可能缺少什么吗? 谢谢!

2 个答案:

答案 0 :(得分:4)

因为您没有从replicateInner(--n)返回结果,就像这样

return replicateInner(--n);

此外,当您将inputArray.slice(0)推送到outputArray时,结果将是这样的

[ [ 2, 3, 4 ], [ 2, 3, 4 ] ]

你需要做的是像这样连接数组

outputArray = outputArray.concat(inputArray.slice(0));

通过此更改,输出变为

[ 2, 3, 4, 2, 3, 4 ]

答案 1 :(得分:1)

很棒的问题。这是一个简化的答案,既有IIFE又有递归。我们不需要传递任何东西或将任何东西传递给IIFE,因为它全部都处于封闭范围内。

var replicate = function (inputArray, n) {
    var outputArray = [];
    (function replicateInner() {
        if (n > 0) {
            outputArray = outputArray.concat(inputArray.slice(0));
            --n;
            replicateInner()
        }
    })();
    return outputArray;
};