functional programming常见面试题

348 阅读1分钟

1.手写一个filter方法,命名为myFilter

// the global Array
var s = [23, 65, 98, 5];
Array.prototype.myFilter = function(callback){
  var newArray = [];
  // Add your code below this line
  this.forEach(item=>{
    if(callback(item)===true){ //直接调用callback判断结果是否为真。
      newArray.push(item)
    }
  })
  // Add your code above this line
  return newArray;
};
var new_s = s.myFilter(function(item){
  return item % 2 === 1;
});

2.用reduce方法 polyfill一个filter方法

reduce方法可以关联两个元素,而filter和map方法只能遍历元素,没法建立两个元素的关系,所以filter和map只是reduce的一种特例形式,通过reduce方法我们可以完全polyfill一个filter方法或者map方法;

var arr = [1,2,3]; //测试数据
//用reduce方法实现filter的功能
var result = arr.reduce((total,current)=>{
        if(current>=2){
            total.push(current);
        }
        return total;
},[]);
console.log(result);//[ 2, 3 ]

// 用reduce polyfill 一个filter
Array.prototype.myFilter = function(func){
    return this.reduce((total, current)=>{
            if(func(current)){
                total.push(current)
            }
            console.log("total:", total);
            return total;
    }, []);
};
console.log("应该打印[2,3]");
console.log(arr.myFilter(item=>item>1));

3.用reduce polyfill 一个map方法

//用reduce方法实现map的功能  
var mapResult = arr.reduce((total, current)=>{
        total.push(current*current)
        return total;
},[]);
console.log(mapResult); //[ 1, 4, 9 ]
Array.prototype.myMap = function(func){
    return this.reduce((total, current)=>{
            total.push(func(current));
            return total;
    },[]);
};
console.log("应该打印[1,4,9]");

4. 通过reduce的方法compose函数

function compose(funcs){
    return funcs.reduce((a, b) => (...args) => a(b(...args)))   
}