递归创建数组

时间:2019-01-04 19:48:19

标签: javascript

我正在尝试实现一个递归函数,该函数通过递归填充来返回函数数组

//arr = [1..1000]
//arr2 = [1,2,3]
function divideToSmallerTasks(arr, arr2) {
    let arrLength = arr.length;
    if (arr === undefined || arrLength == 0) {
        return [];
    } else if (arrLength > 100) {
        return (getRelatedGames(arr.slice(0, 100), arr2)).push(divideToSmallerTasks(arr.slice(100, arrLength), arr2));
    } else {
        return (getRelatedGames(arr, arr2).push(divideToSmallerTasks([], arr2));
}

我希望返回一组函数smallerTasks = [function(arr[1..100],arr2[1,2,3]),function(arr[100,..200],arr2[1,2,3]),...],以便以后可以并行运行它们。

2 个答案:

答案 0 :(得分:0)

您的代码正在作为hdfs:///的一部分立即调用getRelatedGames函数。您想要做的是创建一个匿名函数,该函数执行后将按照您所说的运行getRelatedGames并返回该函数。接近以下内容:(未试用)

divideToSmallerTasks

这应该会产生一个函数列表,您可以在需要时逐个执行这些函数,并执行预期的getRelatedGames调用。

答案 1 :(得分:0)

您需要返回一个数组,而不是由push返回的新长度。

如果未获得闭包,则可以添加一个稍后再调用getRelatedGames的函数。在这里,此功能将替换为console.log

function divideToSmallerTasks(arr, arr2) {
    const defer = (fn, ...args) => () => fn(...args);

    let arrLength = arr.length;

    if (arr === undefined || !arrLength) {
        return [];
    }

    if (arrLength > 3) {
        return [defer(console.log, arr.slice(0, 3), arr2), ...divideToSmallerTasks(arr.slice(3, arrLength), arr2)];
    }

    return [defer(console.log, arr, arr2)];
}

var array = divideToSmallerTasks([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], ['a', 'b', 'c']);

console.log(array);

array.forEach(fn => fn());
.as-console-wrapper { max-height: 100% !important; top: 0; }