3.实现数组 reduce filter map find 等方法

268 阅读2分钟

1.reduce函数实现

reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。

Array.prototype._reduce = function (fn,initVal,context) {
    let arr = Array.prototype.slice.call(this);
    for(let i=0;i<arr.length;i++){
        initVal = fn.call(context,initVal,arr[i],i,this);
    }
    return initVal
};

let arr1=[2,4,6,8];
let result1=arr1._reduce(function (val,item,index,origin) {
    return val+item
},0);

console.log(result1) //20

2.map函数实现

map()方法返回一个新数组,数组中的元素为原始数组元素调用函数处理的后值。

Array.prototype._map = function (fn,initVal,context) {
    let arr = Array.prototype.slice.call(this);
    let ret = [];
    for(let i=0;i<arr.length;i++){
        ret.push(fn.call(context,arr[i],i,this));
    }
    return ret
};

//reduce实现
Array.prototype._map2 = function (fn,context) {
  let arr = Array.prototype.slice.call(this);
  let ret = [];
  return arr._reduce((init,cur,i)=>{
    return [...init,fn.call(context,cur,i,this)]
  },[])
};

let arr2=[2,4,6,8];
let result2 = arr2._map(function(item,index,origin){
  return item*2;
});

console.log(result2) // [4,8,12,16]

3.filter 函数实现

filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。

Array.prototype._filter = function (fn,context) {
  let arr = Array.prototype.slice.call(this);
  let ret = [];
  for (let i = 0; i < arr.length; i++) {
    fn.call(context,arr[i],i,this)&&newArr.push(arr[i])
  }
  return ret;
};


//reduce实现
Array.prototype._filter2 = function (fn,context) {
  let arr = Array.prototype.slice.call(this);
  return arr.reduce((init,cur,i)=>{
    return fn.call(context,cur,index,this)?[...init,cur]:[...init];
  },[])
}

let arr3=[2,4,6,8];
let result3 = arr3._filter(function(item,index,origin){
  return item>4;
});

console.log(result3) // [6,8]

4.find 函数实现

find() 方法返回通过测试(函数内判断)的数组的第一个元素的值,都不符合条件返回undefined

Array.prototype._find = function (fn,context) {
  let arr = Array.prototype.slice.call(this);
  for (let i = 0; i < arr.length; i++) {
    if (fn.call(context,arr[i],i,this)) {
      return arr[i];
    }
  }
};

let arr4=[2,4,6,8];
let result4 = arr4._find(function(item,index,origin){
  return item>4;
});

console.log(result4) // 6

5.every 函数实现

every()方法用于检测数组所有元素是否都符合指定条件(通过函数提供)。

如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测。

如果所有元素都满足条件,则返回 true。

Array.prototype._every = function (fn,context) {
  let arr = Array.prototype.slice.call(this);
  for (let i = 0; i < arr.length; i++) {
    if (!fn.call(context,arr[i],i,this)) {
      return false;
    }
  }
  return true;
};

let arr5=[2,4,6,8];
let result5 = arr5._every(function(item,index,origin){
  return item>4;
});

console.log(result5) // false

6.some 函数实现

some()方法用于检测数组中的元素是否满足指定条件(函数提供)。

如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。

如果没有满足条件的元素,则返回false。

Array.prototype._some = function (fn,context) {
  let arr = Array.prototype.slice.call(this);
  for (let i = 0; i < arr.length; i++) {
    if (fn.call(context,arr[i],i,this)) {
      return true;
    }
  }
  return false;
};

let arr6=[2,4,6,8];
let result6 = arr6._some(function(item,index,origin){
  return item>4;
});

console.log(result6) // true