手写Array数组方法——reduce、map、filter、forEach等

228 阅读1分钟

reduce

let arr = [1,2,3,4];
Array.prototype.reduce = function(callback, prev) {
  if(this == undefined) {
    return 'this is undefined';
  }
  if(typeof callback !== 'function') {
    throw new TypeError('callback is not a function');
  }
  // 遍历this数组
  let arr = this;
  for(let i = 0; i < arr.length; i++) {
     //判断有没有设置初始值
    if(prev === undefined) {
    //没有初始值,则调用callback,转入当前值,下一个值,当前index为下一个,当前数组
      prev = callback(arr[i], arr[i+1], i+1, arr);
    } else {
      prev = callback(prev, arr[i], i, arr);
    }
  } 
  return prev;
}
let sum = arr.reduce((prev,cur) => {
  return prev+cur;
},0)
console.log(sum);

filter

let arr = [1,2,3,4];
Array.prototype.filter = function(callback, thisArgs) {
  if(this == undefined) {
    return 'this is undefined';
  }
  if(typeof callback !== 'function') {
    throw new TypeError('callback is not a function');
  }
  let arr = this;
  let res = [];
  for(let i = 0; i < arr.length; i++) {
    if(callback.call(thisArgs,arr[i])) {
      res.push(arr[i]);
    }
  }
  return res;
}
let arr2 = arr.filter((item) => {
  return item % 2 == 0 ? true : false;
})
console.log(arr2);

map

Array.prototype.map = function(callback, thisArgs) {
  if(this == undefined) {
    return 'this is undefined';
  }
  if(typeof callback !== 'function') {
    throw new TypeError('callback is not a function');
  }
  let arr = this;
  let res = [];
  for(let i = 0; i < arr.length; i++) {
    res.push(callback.call(thisArgs, arr[i]));
  }
  return res;
}
let arr3 = arr.map((item) => {
  return item * 2;
})
console.log(arr3);

forEach

Array.prototype.forEach = function(callback,thisArg){
  var len = this.length;
  for(var i = 0; i < len; i++){
   // callback(this[i], i, this);
   callback.call(thisArg,this[i], i, this);
  }
}
//  只是对每个元素运行了一边函数,但是没有返回值
let arr = [1,2,3,4];
arr.forEach((item) => {
   return item * 2;
})
console.log(arr);  //[1,2,3,4]

reduce 实现map

//  reduce 实现map
Array.prototype.map = function(callback, thisArgs){
  let res = [];
  this.reduce((prev, cur) => {
    res.push(callback(cur));
  },arr[0]);
  return res;
}
let arr = [1,2,3,4];
let arr3 = arr.map((item) => {
  return item * 2;
})
console.log(arr3);