javascript - 如何在 JavaScript 中递归地表达 .filter() 函数?

标签 javascript recursion

这是我正在练习的映射函数;

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/

相关文章:

c - 理解啤酒瓶示例中的递归

scala - 我有一个 Expr 值,在 Scala 中有两个子 Expr,我怎样才能在尾部位置执行它?

javascript - 在 unicode 问题上用正则表达式替换/替换所有

javascript - 使用 jQuery clone() 添加输入行

javascript - 如何启用双指缩放?

recursion - 尾递归堆栈溢出

javascript - 递归函数调用返回

javascript - 有没有办法从 js 对象中删除整个属性

Javascript - 显示每秒递增的数字

c - 为什么 fun(int i) 中的 printf 语句没有执行?