在网上找到的函数式编程练习中,说明如下:
“实现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;
}
}
}
}
我想知道这些是否有意义或者可以完成。
答案 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/
所以这样做如下:
each()
函数为collection
参数中的每个项执行匿名函数。test
参数中提供的函数,传递当前项值,如果该函数返回true(或truthy值),则将项添加到results
数组results
。我将保留对参数的任何验证(例如,检查test
实际上是一个函数)。