【问题标题】:Array Replication Function in JavaScript using self-executing inner functionJavaScript中使用自执行内部函数的数组复制函数
【发布时间】:2014-05-06 22:29:30
【问题描述】:

我正在尝试在 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]

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

【问题讨论】:

    标签: javascript


    【解决方案1】:

    因为你没有从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 ]
    

    【讨论】:

    • 做到了!谢谢!这是工作小提琴:jsfiddle.net/databass/hX8Qk
    • @DavidByman 很高兴能帮上忙!如果您觉得它对您有用,请随时 accept my answer。 :-)
    • 但无论是使用 push 还是 concat,我都会得到相同的结果。
    • @DavidByman 你确定吗?当你使用.push 时,你会得到一个数组数组。
    • @DavidByman 正确,你得到了两个数组,对吧?但你不希望这样。
    【解决方案2】:

    很棒的问题。这是一个具有 IIFE 和递归的简化答案。我们不需要传递任何东西或将任何东西传递给 IIFE,因为它都在闭包范围内。

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

    【讨论】:

    • 这样干净多了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多