JavaScript开发者应懂的33个概念<9>-map, reduce, filter 等高阶函数

62 阅读6分钟

JavaScript开发者应懂的33个概念<9>-map, reduce, filter 等高阶函数

目录

  1. 调用堆栈
  2. 原始类型
  3. 值类型和引用类型
  4. 隐式, 显式, 名义和鸭子类型
  5. == 与 ===, typeof 与 instanceof
  6. this, call, apply 和 bind
  7. 函数作用域, 块级作用域和词法作用域
  8. 闭包
  9. map, reduce, filter 等高阶函数
  10. 表达式和语句
  11. 变量提升
  12. Promise async 与 wait
  13. 立即执行函数, 模块化, 命名空间
  14. 递归
  15. 算法
  16. 数据结构
  17. 消息队列和事件循环
  18. setTimeout, setInterval 和 requestAnimationFrame
  19. 继承, 多态和代码复用
  20. 按位操作符, 类数组对象和类型化数组
  21. DOM 树和渲染过程
  22. new 与构造函数, instanceof 与实例
  23. 原型继承与原型链
  24. Object.create 和 Object.assign
  25. 工厂函数和类
  26. 设计模式
  27. Memoization
  28. 纯函数, 函数副作用和状态变化
  29. 耗性能操作和时间复杂度
  30. JavaScript 引擎
  31. 二进制, 十进制, 十六进制, 科学记数法
  32. 偏函数, 柯里化, Compose 和 Pipe
  33. 代码整洁之道

简介

记录一个重新学习javascript的过程 ,文章并不是按顺序写的,写完就会更新目录链接 本篇文章目录是参照 @leonardomso 创立,英文版项目地址在这里

1.高阶函数

高阶函数:一个函数如果接收另一个函数作为参数,或者该函数会返回另外一个函数作为返回值,那么这个函数就被称之为一个高阶函数。

function makeAdder(count) {
    function add(num) {
        return count+num
    }
    return add
}

var add5 = makeAdder(5)  //这里的add5实际上是一个函数,因为makeAdder()返回值为一个函数
console.log(add5(6))//11

2.map

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

  2. map()不会对空数组进行检测。

  3. map()不会改变原始数组。

传递给 map() 方法的回调函数接受 3 个参数:currentValue,index 和 array。

  1. currentValue:必须。当前元素的的值。

  2. index:可选。当前元素的索引。

  3. arr:可选。当前元素属于的数组对象

代码示例

有一个数组,所有值加1

let arr = [10, 20, 30, 40, 50, 60, 70, 80];
let newArr = arr.map((item) => {
    return item + 1;
});
console.log(newArr)//[11, 21, 31, 41, 51, 61, 71, 81]
console.log(arr);//原数组不变 [10, 20, 30, 40, 50, 60, 70, 80]

3.filter

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

  2. filter()不会对空数组进行检测。

  3. filter()不会改变原始数组。

传递给 filter() 方法的回调函数接受 3 个参数:currentValue,index 和 array。

  1. currentValue:必须。当前元素的的值。

  2. index:可选。当前元素的索引。

  3. arr:可选。当前元素属于的数组对象

代码示例:返回数组中大于50的元素

let arr = [10, 20, 30, 40, 50, 60, 70, 80];
let newArr = arr.filter((item) => {
    return item > 50;
});
console.log(newArr)//[60, 70, 80]
console.log(arr);//原数组不变 [10, 20, 30, 40, 50, 60, 70, 80]

4.some

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

  2. some() 方法会依次执行数组的每个元素。

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

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

  5. some()不会对空数组进行检测。

  6. some()不会改变原始数组。

代码示例:判断数组中是否含有大于 50 的数字

let arr = [10, 20, 30, 40, 50, 60, 70, 80];
let result = arr.some((item) => {
    return item > 50;
});
console.log(result )//true

5.every

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

every() 方法会依次执行数组的每个元素。

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

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

every()不会对空数组进行检测。

every()不会改变原始数组。

let arr = [10, 20, 30, 40, 50, 60, 70, 80];
let result = arr.every((item) => {
    return item > 50;
});
console.log(result )//false

6.reduce

reduce() 方法对数组中的每个元素按序执行一个 reducer 函数,每一次运行 reducer 会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值。

reduce 方法接收两个参数:

(1)回调函数

(2)一个可选的 initialValue (初始值)。如果不传第二个参数 initialValue,则函数的第一次执行会将数组中的第一个元素作为 prev 参数返回。

传递给 reduce() 方法的回调函数接受 4 个参数:prev, current, currentIndex, arr。

  1. prev:必须。函数传进来的初始值或上一次回调的返回值。

  2. current:必须。数组中当前处理的元素值。

  3. currentIndex:可选。当前元素索引。

  4. arr:可选。当前元素所属的数组本身。

1.数组求和

let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let sum = arr.reduce((prev, current) => {
    return prev + current;
}, 0);
console.log(sum);//55

2.数组去重

//数组去重
let myArray = ['a', 'b', 'a', 'b', 'c', 'e', 'e', 'c', 'd', 'd', 'd', 'd']
const myArrayNo =myArray.reduce(function(pre,cur){
    if(pre.indexOf(cur)==-1){
        pre.push(cur)
    }
    return pre
},[])

console.log(myArrayNo);//[ 'a', 'b', 'c', 'e', 'd' ]

7. find

  • find()方法用于查找符合条件的第一个元素,如果找到了,返回这个元素,否则,返回undefined。

  • find()不会对空数组进行检测。

  • find()不会改变原始数组。

传递给 find() 方法的回调函数接受 3 个参数:currentValue,index 和 array。

  • currentValue:必须。当前元素的的值。

  • index:可选。当前元素的索引。

  • arr:可选。当前元素属于的数组对象。

代码示例:返回数组中第一个大于50的元素

let arr = [10, 20, 30, 40, 50, 60, 70, 80];
let result = arr.find((item) => {
    return item > 50;
});
console.log(result )//60

8.findIndex

findindex()find() 类似,也是查找符合条件的第一个元素,不同之处在于 findindex() 会返回这个元素的索引,如果没有找到,返回 -1

let arr = [10, 20, 30, 40, 50, 60, 70, 80];
let result = arr.findIndex((item) => {
    return item > 50;
});
console.log(result )//5 (索引)