在一次采访中,有人向我提出了一个让我摸不着头脑的问题。我不想花周末担心结果,而是想尝试解决问题,但我无法弄清楚:
使用下面的reduce函数,构建一个过滤函数,该函数将一个数组和一个测试函数作为参数,并返回一个新数组,该数组已根据测试函数过滤了前一个数组的元素。
使用 forEach 或类似的方法会很简单,但要求是使用这个reduce 函数:
function reduce(array, combine, start) {
var current = start;
for (var i = 0; i < array.length; i++)
current = combine(current, array[i]);
return current;
}
Run Code Online (Sandbox Code Playgroud)
所以
var myArray = [0, 1, 3, 5, 9];
console.log(filter(myArray,function(x){
return x > 2;
}));
Run Code Online (Sandbox Code Playgroud)
会回来
[3,5,9]
我尝试了以下方法,但收到了非法的退货声明,我什至不确定我是否走在正确的道路上。
function filter(array, test){
var giveArray = [];
if(reduce(array,function(current,start){
return test(current);
},false)){
giveArray.push(current);
}
}
return giveArray;
}
Run Code Online (Sandbox Code Playgroud)
基本思想是使用combine传递给的函数reduce作为过滤元素的手段。您的方法似乎暗示reduce应该返回一个布尔值,但这不是它的用途。用于test条件检查,reduce并将用于用传递的元素填充数组。
function filter(array, test) {
return reduce(array, function(arr, el) {
// Only add to the array if the test function is true
if (test(el)) {
arr.push(el);
}
// Always return the same array so you can keep filling it
return arr;
}, []); // Give it an empty array to start with
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14586 次 |
| 最近记录: |