这是我正在使用的映射功能;

var list = [1,2,3,4,5];

function isOdd(v) {
    return v % 2 == 1;
}

function exclude(arr, fn) {
    var myList = [];
    for (var i = 0; i < arr.length; i++) {
        if (fn(arr[i])) {
            myList.push(arr[i]);
        }
    };
    return myList;
}


我想用递归解决方案代替for循环,但是由于我在第2行的每个函数调用中都启动了一个新列表,因此它无法产生适当的数组。如何使用递归解决呢?这是我最近得到的;

function exclude(arr, fn) {
    let myList = [];
    if (arr.length = 1) {
        if (fn(arr[0])) {
            return myList.push(arr[0]);
        }
    } else {
        return myList.push(exclude(arr.slice(1), fn));
    }
}

console.log(exclude(list, isOdd));

最佳答案

试试这个解决方案。我对您的实现进行了一些更改。



function exclude(arr, fn, output) {
  output || (output = []);

  if(!arr.length) {
    return output;
  }

  if (fn(arr[0])) {
    output.push(arr[0]);
  }

  return exclude(arr.slice(1), fn, output);
}

console.log(exclude([1,2,3,4,5,6,7,8,9], function(i) { return i % 2; }));

关于javascript - 如何在JavaScript中递归表示.filter()函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41608802/

10-09 18:02
查看更多