首页 > 编程语言 >JavaScript 中的函数式编程

JavaScript 中的函数式编程

时间:2024-03-20 22:24:38浏览次数:36  
标签:编程 函数 JavaScript reduce name 初始值 linesOfCode programmerOutput

一、问题背景

例子

下面的代码是一个函数式编程的例子
我们先观察一下里面有哪些特殊的语法点,再一一讲解

const programmerOutput = [
  {
    name: 'Uncle Bobby',
    linesOfCode: 500,
  },
  {
    name: 'Suzie Q',
    linesOfCode: 1500,
  },
  {
    name: 'Jimmy Gosling',
    linesOfCode: 150,
  },
  {
    name: 'Gracie Hopper',
    linesOfCode: 1000,
  },
];

const totalOutput = programmerOutput.reduce(
  (totalLines, output) => totalLines + output.linesOfCode,
  0
);

语法点

我们注意到3个语法点

  1. programmerOutput 是一个数组,其元素有 linesOfCode 的字段
  2. programmerOutput.reduce 返回给了一个叫totalOutput的变量,可以猜想到返回值是数组programmerOutput各个元素linesOfCode字段的和
  3. reduce 函数接受了2个参数,一个是带 "=>" 的函数,一个是0

二、解释

下面一个一个解释

1. reduce

reduce()函数,用于将一个数组(或可迭代对象)中的元素通过指定函数进行计算,最后得到一个单一结果
简单来说就是对一个array执行reduce()方法,就是把其中的function()挨个地作用于array中的元素上,而且上一次的输出会作为下一次的一个输入。

reduce()函数接受2个参数,1个是回调函数function,1个是初始值initialValue

reduce()函数原型
array.reduce(function(accumulator, currentValue, currentIndex, arr), initialValue);
/*
  accumulator:  必需。累计器
  currentValue: 必需。当前元素
  
  currentIndex: 可选。当前元素的索引;                    
  arr:          可选。要处理的数组
  initialValue: 可选。传递给函数的初始值,相当于accumulator的初始值
*/
回调函数

函数原型 function(accumulator, currentValue, currentIndex, arr)
回调函数function接受4个参数, 分别是
累加器 accumulator
当前元素 currentValue
当前索引 currentIndex
原数组 arr
回调函数的作用是将当前元素与累加器进行某种操作,并返回一个新的累加器
如果提供了初始值,就将其作为第一次调用回调函数的累加器的初始值
如果没有提供初始值,则将数组的第一个元素作为累加器的初始值,并从第二个元素开始遍历数组

在这个例子中
数 组: programmerOutput
箭头函数: (totalLines, output) => totalLines + output.linesOfCode作为回调函数, 它接受2个参数,并返回他们的和
初始值 : 0

2. 箭头函数

javascript的箭头函数是为了简化代码,增强可读性,类似的python也有lambda函数
javascript的箭头函数 vs python的lambda函数

# js 中的箭头函数
const add = (x, y) => x + y

# Python 中的 lambda 表达式
add = lambda x, y: x + y

传统写法

如果不用函数式编程,代码将变成这样
比较一下,哪种方式更简洁呢?

const programmerOutput = [
  {
    name: 'Uncle Bobby',
    linesOfCode: 500,
  },
  {
    name: 'Suzie Q',
    linesOfCode: 1500,
  },
  {
    name: 'Jimmy Gosling',
    linesOfCode: 150,
  },
  {
    name: 'Gracie Hopper',
    linesOfCode: 1000,
  },
];

let totalOutput = 0;

for (let i = 0; i < programmerOutput.length; i++) {
  totalOutput += programmerOutput[i].linesOfCode;
}

三、参考资料

https://zhuanlan.zhihu.com/p/65235741
这里有一个演示的GIF
https://vdn6.vzuu.com/SD/5cf291d0-2393-11eb-a8c1-c291194912b4.mp4?pkey=AAXuxzZB3-v5sWqag4u6kqBDfc6OXgXWLAN1yWeid9zgjMjug17PfmOU3XbxgUHEVYFOSWLfQi0Z4DGgT-VNslNz&c=avc.0.0&f=mp4&pu=078babd7&bu=078babd7&expiration=1710951074&v=ks6

标签:编程,函数,JavaScript,reduce,name,初始值,linesOfCode,programmerOutput
From: https://www.cnblogs.com/studentWangqy/p/18086252

相关文章

  • 六、函数
    本章专题脉络1、函数的基本使用1.1为什么需要函数《街霸》游戏中,每次人物出拳、出脚或跳跃等动作都需要编写50-80行的代码,在每次出拳、出脚或跳跃的地方都需要重复地编写这50-80行代码,这样程序会变得很臃肿,可读性也非常差。为了解决代码重复编写的问题,可以将出拳、出脚或跳......
  • 字符串常用函数简易模拟
    strlensize_tMy_strlen(char*str){intcount=0;while(*str){count++;str++;}returncount;}strcpychar*my_strcpy(char*dest,constchar*src){char*ret=dest;//拷贝src指向的字符串到dest指向的空间,......
  • MySQL学习八:窗口函数(一)
    目录一、窗口函数1.窗口函数定义2.窗口函数语法3.演示表格一4.窗口的确定4.1例1:查询各班级总分4.2例2:查询各班级累计总分4.3分区子句(partitionby)4.4排序子句(orderby)4.5窗口子句(rows)4.6总体执行流程5.函数分类5.1排序类函数5.2聚合类函数5.3跨行类函数......
  • 在sort中传入仿函数
    仿函数就是用来控制排列顺序的map<int,int,Compare>是这样,list.sort()也是这样.//List双向链表.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。//#include<iostream>#include<list>usingnamespacestd;structCompare{ booloperator()(constint&......
  • 你真的了解c语言的10大字符串函数吗?
    乐观学习,乐观生活,才能不断前进啊!!!我的主页:optimistic_chen我的专栏:c语言点击主页:optimistic_chen和专栏:c语言,创作不易,大佬们点赞鼓励下吧~前言:长度不受限制的字符串函数-strcpy,strcat,strcmp长度受限制的字符串函数-strncpy,strncat,strncmp文章目录前言:1.st......
  • 字符串函数
    这些字符串函数一定加头文件#include<string.h>strlen函数:1.它的功能:计算字符串的长度 2.strlen的实现:intmy_strlen(constchar*str){intcount=0;assert(str);while(*str){count++;str++;}returncount;}strcut函数:1.这个函数实现的是字......
  • (day 13)JavaScript学习笔记(对象1)
    概述        这是我的学习笔记,记录了JavaScript的学习过程。在写博客的时候我会尽量详尽的记录每个知识点。如果你完全没接触过JavaScript,那么这一系列的学习笔记可能会对你有所帮助。    今天学习对象,主要是创建对象、对象属性、省略key、遍历对象属性、删......
  • SQL窗口函数
    通俗易懂的学会:SQL窗口函数-知乎(zhihu.com)SQL题目讲解——窗口函数(一)_哔哩哔哩_bilibili因为窗口函数是对where或者groupby子句处理后的结果进行操作,所以窗口函数原则上只能写在select子句中  ......
  • AST20201网络编程
    Web编程实验JavaScript-2将所有完成的html、CSS和图像文件保存在名为lab4_yourname的文件夹中,其中包含的子文件夹必要时组织文件夹。压缩文件夹并在截止日期前提交给Moodle在Moodle中指定。注意,您需要确保所有图像路径/链接都可以工作适当地放在您提交的文件夹和子文件夹中。任务......
  • JavaScript中的“==“和“===“运算符的区别
    JavaScript中的比较运算符"=="和"==="用于比较两个值是否相等。尽管它们的目的相同,但它们在比较过程中采用了不同的策略1.“==”相等运算符:"=="运算符执行一种松散相等比较,它在比较之前会进行类型转换。如果进行比较的两个值类型不同,JavaScript会尝试将它们......