使用reduce在Javascript中构建过滤函数

时间:2016-01-22 19:21:37

标签: javascript arrays

我在一次采访中提出了一个问题让我摸不着头脑。我不想花费周末担心结果,而是想尝试解决问题,但我无法弄清楚:

使用下面的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;
}

所以

var myArray = [0, 1, 3, 5, 9];
console.log(filter(myArray,function(x){
 return x > 2; 
}));

将返回

[3,5,9]

我尝试了以下但我收到了非法的退货声明,我甚至不确定我是否会走在正确的道路上。

function filter(array, test){
 var giveArray = [];
  if(reduce(array,function(current,start){
    return test(current);
  },false)){
    giveArray.push(current);  
  }
 } 
  return giveArray;
}

2 个答案:

答案 0 :(得分:2)

基本思路是使用传递给combine的{​​{1}}函数作为过滤元素的方法。你的方法似乎意味着reduce应该返回一个布尔值,但这不是它的用途。使用reduce进行条件检查,test将用于使用传递元素填充数组。

reduce

答案 1 :(得分:0)

我已经看过几次了((由reduce-addicts ^^ u撰写)

 function filter(array, test) {
  return reduce(array, function(arr, el) {
    // Only add to the array if the test function is true
    if (test(el)) {
      return [...current, el]
    }
    // Always return the same array so you can keep filling it
    return [...current]
  }, []); // Give it an empty array to start with
}