高阶函数源码实现es6

前言

函数式编程

一、forEach

forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。

const foreach = (fn, arr) => {
  for (let i = 0; i < arr.length; i++) {
    fn(arr[i]);
  }
};
// let a = foreach(item => {
//   console.log(item);
// }, arr);

二、map

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

const map = (fn, arr) => {
  let arrCopy = [];
  for (let i = 0; i < arr.length; i++) {
    arrCopy.push(fn(arr[i]));
  }
  return arrCopy;

三、filter

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

const filter = (fn, arr) => {
  let arrCopy = [];
  for (let i = 0; i < arr.length; i++) {
    if (fn(arr[i])) {
      arrCopy.push(arr[i]);
    }
  }
  return arrCopy;
};

四、some

some() 方法用于检测数组中的元素是否满足指定条件(函数提供)。
some() 方法会依次执行数组的每个元素:
如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。
如果没有满足条件的元素,则返回false。

const some = (fn, arr) => {
  let time = false;
  for (let i = 0; i < arr.length; i++) {
    if (fn(arr[i])) {
      time = true;
      break;
    }
  }
  return time;
};

六、every

every() 方法用于检测数组所有元素是否都符合指定条件(通过函数提供)。
every() 方法使用指定函数检测数组中的所有元素:
如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测。
如果所有元素都满足条件,则返回 true。

const every = (fn, arr) => {
  let time = true;
  let i = null;
  for (i = 0; i < arr.length; i++) {
    if (!fn(arr[i])) {
      time = false;
      break;
    }
  }
  if (i == arr.length && time) {
    return true;
  } else {
    return false;
  }
};

七、reduce

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

const reduce = (fn, initNum, arr) => {
  var init = initNum;
  for (let i = 0; i < arr.length; i++) {
    let a = fn(init, arr[i]);
    typeof init === 'function' ? init.push(a) : (init = a);
  }
  return init;
};

八、once

const once = fn => {
  let time = false;
  return function () {
    if (!time) {
      time = true;
      fn();
    }
  };
};

总结

多学多练。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值