使用带有两个参数的函数实现JS本机'filter'方法

时间:2016-07-09 01:26:54

标签: javascript foreach functional-programming

在网上找到的函数式编程练习中,说明如下:

“实现JavaScript的本机'过滤'方法,该方法接受两个参数(一个集合和一个返回'true'或'false'的测试函数),并使用您之前编写的'each'函数迭代集合。返回结果数组。“

我已经完成了练习的第一部分,并创建了一个实现JS'forEach方法的函数:

var each = function(collection, iterator) {
  if(Array.isArray(collection)){
   for(var i = 0; i < collection.length; i++){
  // value, key/property, collection
    iterator(collection[i],i,collection);
  }
  } else if (typeof collection === "object"){
    for(var property in collection){
      iterator(collection[property], property, collection);
    }

   }else{
     console.log("you messed up!");
  }
 };

用以下方法测试我的功能:

function returnOdds(currentEl) {
   return currentEl % 2 !== 0;
}
 console.log(filter([1, 2, 3], returnOdds)); // output: 1, 3

我不确定如何在我的过滤器函数中的'collection'参数上调用我的'each'函数。

这是合法的吗?

function filter(collection, test) {
   each(collection);

}

或许我可以将'test'参数调用为检查collection [i]是不是偶数/奇数的函数?

function filter(collection, test) {
   var odd = function(each()){
    each(collection){
       if(collection[i] !== 0){
            return odd;
          }
         }
       }
    }

我想知道这些是否有意义或者可以完成。

1 个答案:

答案 0 :(得分:1)

要求您实现的filter()函数需要以某种方式构建一个通过测试的新数组值,然后返回该新数组。以下是使用现有each()方法执行此操作的一种方法:

var filter = function(collection, test) {
  var results = [];
  each(collection, function(val) {
    if (test(val)) {
      results.push(val);
    }
  });
  return results;
};

然后,您可以按照在问题中间显示的方式调用此函数,传入数组并引用其他函数,该函数将为给定项返回true或false:

var oddNumbers = filter([1, 2, 3], returnOdds);

演示:https://jsfiddle.net/4rj7phot/

所以这样做如下:

  1. 为结果创建一个空数组。
  2. 使用each()函数为collection参数中的每个项执行匿名函数。
  3. 在匿名函数中,调用test参数中提供的函数,传递当前项值,如果该函数返回true(或truthy值),则将项添加到results数组
  4. 返回results
  5. 我将保留对参数的任何验证(例如,检查test实际上是一个函数)。