只需10分钟即可破解概念



作为开发人员,我喜欢编写特别是JavaScript的代码。 根据我的经验,使用reduce函数是JS中最困难的任务之一。 首先让我详细介绍Reduce的概念!

在Wikipedia中,它有许多名称。

减少
折页
积累
骨料
压缩

它是一项将列表折叠成任何数据类型的功能。 这是将结构分解为单个值的全部。 这就像折叠一个盒子! 使用reduce时,可以通过将它们全部加起来将数组[1,2,3,4,5]转换为数字15。

过去是如何做到的?

假设您可能需要一个循环才能将列表折叠成数字,您可以这样做:

const add = (x, y) => x + y; const numbers = [1, 2, 3, 4, 5]; let total = 0; for (let i = 0; i < numbers.length; i++) { total = add(total, numbers[i]); } console.log(total); 

但是,使用reduce函数,您只需要一个循环即可处理“ add function”。 代码如下:

 const add = (x, y) => x + y; const numbers = [1, 2, 3, 4, 5]; numbers.reduce(add); 

瞧,这就是简化编码的方式!

目前,请注意不能使用循环,递归或数组方法(例如forEach,some,find等)的JavaScript。 因此,地图,过滤器和归约器仅剩三个。 但是,我们作为程序员的工作没有改变。 我们的应用程序中仍然需要三种类型的功能。

->过滤列表
->转换列表
->将列表转换为数据类型。 字符串,布尔值,数字,对象

使用工具过滤,映射和归约可以轻松应对上述挑战。

Array.filter判断列表

如果您想要一个删除了某些项目的新列表(例如,当用户搜索您的联系人列表时),该怎么办? 因此,只需创建一个基于输入(谓词)返回true或false的函数。

 const isEven = (x) => x % 2 === 0; 


现在,将其插入过滤器以将其应用于整个列表。

 const numbers = [1, 2, 3, 4, 5]; numbers.filter(isEven); 

Array.map转换列表

简而言之,将列表转换为其他列表是前端开发。 因此,该地图涵盖了您的大部分列表工作。

假设我们的应用程序为用户列表调用了API,并且我们需要在屏幕上显示每个用户的姓名。 只需创建一个返回用户名的函数。

 const getUserName = (user) => user.name; 

现在,将其插入地图以针对整个用户列表运行该地图。

 users.map(getUserName) 

Array.reduce可以为您做

Array.reduce使用两个参数

1)初始值(可选)

如果不提供初始值,则reduce函数默认为列表的第一个元素。

为了对纯数字求和,您将编写:

 [1, 2, 3].reduce((total, current) => total + current);/source> In case, you give an initial value of zero, you will use this code: <source lang="markdown"> [{ age: 1 }, { age: 2 }, { age: 3 }] .reduce((total, obj) => total + obj.age, 0); 

2)减速机

当reduce遍历列表时,它将以下两个参数提供给reducer:

->当前值:当前值是不言自明的,就像在常规循环中使用矩阵[i]一样。 但是,累加器是一个听起来很吓人的计算机术语,实际上很简单。

->累加器:浏览用户时,如何跟踪他们的总年龄? 您需要一些计数器变量来保持它。 那就是累加器。 它是最终值,将在完成时减少。

在循环的每个步骤中,它将最后一个累加器和当前元素送入其减速器。 减速器返回的内容将成为下一个累加器。 当列表结束并且具有单个减小的值时,循环结束。

如果您觉得地图和过滤器功能还不够,可以使用reduce来运行游戏。 它可以完成映射和过滤器正在执行的所有操作,还可以完成涉及循环数组的所有其他操作。

让我们借助一个示例来计算用户年龄。 考虑用户的年龄分别为29.30、31和32。

 const users = [ { name: 'Mariam', age: 29 }, { name: 'Kenstar', age: 30 }, { name: 'Saransh', age: 31 }, { name: 'Geoffie', age: 32 }, ]; 

另一方面,map和filter只能返回数组,但是我们需要一个数字!

 users.map(?); users.filter(?); 

如果我们有循环,我们只需要检查用户并在柜台中统计他们的年龄即可! 但是,减少功能可能更容易。

 users.reduce((total, currentUser) => total + currentUser.age, 0); 

现在,在每个步骤中使用console.log可能是上述最简单的方法。

 const users = [ { name: 'Mariam', age: 29 }, { name: 'Kenstar', age: 30 }, { name: 'Saransh', age: 31 }, { name: 'Geoffie', age: 32 }, ]; const reducer = (total, currentUser) => { console.log('current total:', total); console.log('currentUser:', currentUser); // just for spacing console.log('\n'); return total + currentUser.age; } users.reduce(reducer, 0); 

这里分6个步骤总结了整个代码:

->首先,定义reduce函数及其3个参数。
->通过提供初始值,初始化累加器。 它将改变每个循环。
->现在,开始循环遍历给定的数组。
->捕获该周期的数组的currentItem。
->现在是时候使用累加器和currentItem调用reducer并将其保存为新的累加器了
->最后,累加器在循环结束时完成更改并返回。

Source: https://habr.com/ru/post/zh-CN477622/


All Articles