1. filter 筛选

filter() 方法会创建一个新数组,原数组的每个元素传入回调函数中,回调函数中有return返回值,若返回值为true,这个元素保存到新数组中;若返回值为false,则该元素不保存到新数组中;原数组不发生改变。


返回数组,包含了符合条件的所有元素。如果没有符合条件的元素则返回空数组。

注意:

  • filter() 不会对空数组进行检测
  • filter() 不会改变原始数组

    1.1语法:

    array.filter(function(currentValue, index, arr), thisValue)
    **

    1.2 参数说明:

    | 参数 | 描述 | | | —- | —- | —- | | function(currentValue, index, arr) | 必须。函数,数组中的每个元素都会执行这个函数
    函数参数: | | | | 参数 | 描述 | | | currentValue | 必须。当前元素的值 | | | index | 可选。当前元素的索引值 | | | arr | 可选。当前元素属于的数组对象 | | thisValue | 可选。对象作为该执行回调时使用,传递给函数,作用 “this”的值、
    如果省略了 thisValue,”this” 的值为 “undefined” | |

  • 参数演示

image.png

  1. let ages = [32, 33, 16, 17, 40]
  2. let newAges = ages.filter(function(n, index, self){
  3. console.log(n, index, self)
  4. })
  5. console.log(newAges)

**

1.3 代码演示

1.3.1 基本使用

  1. let ages = [32, 33, 16, 17, 40]
  2. let newAges = ages.filter(function(n){
  3. return n >= 18
  4. })
  5. console.log(newAges)
  6. //newAges: [32, 33, 40]
  • 结果得到一个 age 大于等于18的数组

1.3.2 去除空白字符串

  1. let arr = ['A', 'B', null, undefined, 'C', ' '];
  2. let r = arr.filter(function(s) {
  3. return s && s.trim(); // 注意:IE9以下的版本没有trim()方法
  4. })
  5. console.log(r)
  6. //r: ['A', 'B', 'C']

trim() 方法:用于删除字符串的头尾空白符,空白符包括:空格、制表符 tab、换行符等其他空白符等。 trim() 方法不会改变原始字符串。 trim() 方法不适用于 nullundefinedNumber 类型

1.3.3 去除重复元素

  1. let arr = ['JLE', 'Jack', 'Pony', 'Robbin', 'JLE']
  2. let r = arr.filter(function(element, index, self) {
  3. return self.indexOf(element) == index;
  4. })
  5. console.log(r)
  6. //r: ['JLE', 'Jack', 'Pony', 'Robbin']
  • indexOf 是返回指定字符串值在字符串中首次出现的位置。
  • 如果当前元素 首次出现的位置,等于该元素的 index 索引,那么说明这个元素是第一次出现。
  • 否则, 当前元素首次出现的位置,不等于该元素 index索引,说明这个元素之前已经有相同元素,结果就是 return false

2. map

map() 方法按照**原始数组元素顺序**依次处理元素
注意:

  • map() 不会对空数组进行检测
  • map() 不会改变原始数组

2.1 语法

array.map(function(currentValue,index,arr), thisValue)

2.2 参数说明:

参数 描述
function(currentValue, index, arr) 必须。函数,数组中的每个元素都会执行这个函数
函数参数:
参数 描述
currentValue 必须。当前元素的值
index 可选。当前元素的索引值
arr 可选。当前元素属于的数组对象
thisValue 可选。对象作为该执行回调时使用,传递给函数,作用 “this”的值、
如果省略了 thisValue,”this” 的值为 “undefined”

2.3 代码演示

  1. let nums = [2, 3, 7, 8, 12];
  2. let newNums = nums.map(function(n) {
  3. return n * 2
  4. })
  5. console.log(newNums)
  6. //newNums: [5, 6, 14, 16, 25]

详见文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

3. reduce

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

注意:** reduce() 对于空数组是不会执行回调函数的。

3.1 语法

array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

3.2 参数说明:

参数 描述
function(currentValue, index, arr) 必须。函数,数组中的每个元素都会执行这个函数
函数参数:
参数 描述
total 必需。初始值,或者计算结束后的返回值
currentValue 必须。当前元素的值
index 可选。当前元素的索引值
arr 可选。当前元素属于的数组对象
thisValue 可选。对象作为该执行回调时使用,传递给函数,作用 “this”的值、
如果省略了 thisValue,”this” 的值为 “undefined”

3.3 代码演示

案例1:
image.png

  1. let nums = [2, 3, 7, 8, 12];
  2. let sum = nums.reduce(function(prev, cur, index) {
  3. console.log(prev, cur, index);
  4. return prev + cur;
  5. })
  6. console.log(sum)
  • 从上面可以看出,index 是从1 开始的,第一个 prev的值是数组的第一个值。数组长度是 5,但是 reduce 函数循环执行4次。

案例2:
image.png

  1. let nums = [2, 3, 7, 8, 12];
  2. let sum = nums.reduce(function(prev, cur, index) {
  3. console.log(prev, cur, index);
  4. return prev + cur;
  5. }, 0)
  6. console.log(sum)
  • 上面的 index是从0开始的,第一次的 prev的值是我们设置的初始化的值 0,数组长度是5,reduce 函数循环执行5次。

结论:如果没有提供 prev初始化的值,那么 reduce 会从索引1的地方开始执行函数,跳过第一个索引。如果提供了 prev,从索引0开始。

案例3:

  1. let nums = [];
  2. let total = nums.reduce(function(prev, cur, index) {
  3. console.log(prev, cur, index);
  4. return prev + cur;
  5. })
  6. console.log(total)
  • 代码报错:Uncaught TypeError: Reduce of empty array with no initial value

案例4:

  1. let nums = [];
  2. let total = nums.reduce(function(prev, cur, index) {
  3. console.log(prev, cur, index);
  4. return prev + cur;
  5. }, 0)
  6. console.log(total)
  • 我们提供了 初始化的值就不会报错了,所以一般提供初始值更安全

filter map reduce 结合使用例子:
**

[2, 6, 7, 9, 20, 15] 取出数组中 小于10的元素,并 各自平方 求和。

  1. //4 + 36 + 49 + 81
  2. let nums = [2, 6, 7, 9, 20, 15];
  3. let sum = nums.filter(function(n) {
  4. return n < 10;
  5. }).map(function(n) {
  6. return n * n;
  7. }).reduce(function(prev, n){
  8. return prev + n;
  9. }, 0)
  10. console.log(sum)
  11. //sum: 170

使用箭头函数,一行就可以搞定了。

  1. let sum1 = nums.filter(n => n < 10).map(n => n * n).reduce((prev, n) => prev + n, 0);
  2. console.log(sum1)

4. 箭头函数

ES6标准新增了一种新的函数:Arrow Function(箭头函数)。

通常函数定义为:

  1. var fn1 = function(a, b) {
  2. return a + b
  3. }
  4. function fn2(a, b) {
  5. return a + b
  6. }

使用ES6箭头函数语法定义函数,将原函数的“function”关键字和函数名都删掉,并使用“=>”连接参数列表和函数体。

  1. var fn1 = (a, b) => {
  2. return a + b
  3. }
  4. (a, b) => {
  5. return a + b
  6. }

当函数参数只有一个,括号可以省略;但是没有参数时,括号不可以省略。

  1. // 无参
  2. var fn1 = function() {}
  3. var fn1 = () => {}
  4. // 单个参数
  5. var fn2 = function(a) {}
  6. var fn2 = a => {}
  7. // 多个参数
  8. var fn3 = function(a, b) {}
  9. var fn3 = (a, b) => {}
  10. // 可变参数
  11. var fn4 = function(a, b, ...args) {}
  12. var fn4 = (a, b, ...args) => {}

箭头函数相当于匿名函数,并且简化了函数定义。箭头函数有两种格式,一种只包含一个表达式,省略掉了{ … }和return。还有一种可以包含多条语句,这时候就不能省略{ … }和 return

  1. () => return 'hello'
  2. (a, b) => a + b
  1. (a) => {
  2. a = a + 1
  3. return a
  4. }

如果返回一个对象,需要特别注意,如果是单表达式要返回自定义对象,不写括号会报错,因为和函数体的{ … }有语法冲突。
注意,用小括号包含大括号则是对象的定义,而非函数主体

  1. x => {key: x} // 报错
  2. x => ({key: x}) // 正确

关于更多箭头函数:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Arrow_functions https://blog.csdn.net/qq_32614411/article/details/80897256