我正在尝试在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]
知道我在这里可能缺少什么吗? 谢谢!
答案 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;
};