JS代码其实可以这样写

日常工作中,我确实经常去帮大家review代码,长期以来,我发现有些个功能函数,JS其实可以稍微调整一下,或者换个方式来处理,代码就会看起来更清晰,更简洁,甚至效率更高,主要是还更好理解。 下面我列举有5个案例,我们一起来看一下

一、建议考虑使用FlatMap方法


先来看一段同时使用filtermap方法遍历数组的代码。我相信这种场景大家一定碰到过。为了说明问题,这里我用简单的数字内容来举个例子。

const squaredOddNumbers = numbers.filter(num => num % 2 !== 0).map(num => num * num)console.log(squaredOddNumbers);
// 输出:[1, 9, 25, 49, 81]

上面代码这样写,没什么问题,而且方法的连用也是比较推荐的处理方式, 但是,还是请多想想,其实我们有更好的方式来处理这一类问题。

现在我们看使用FlatMap如何实现的

const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const squaredOddNumbers = numbers.flatMap(num => num % 2 !== 0 ? [num * num] : []
);console.log(squaredOddNumbers);
// 输出:[1, 9, 25, 49, 81]

使用FlatMap的好处是

只要遍历一遍,而且不产生中间多余数组

二、建议调整数组方法调用的顺序

日常工作中写的比较多的数组方法有filter()find()map()reduce(),在必要的场景下,我们也建议将这些个方法连起来一起调用。但是,一定要注意调用顺序,否则也会影响效率问题。 比如下面这样:

const numbers = [9, 3, 6, 4, 8, 1, 2, 5, 7];
numbers.sort((a, b) => a - b).filter((n) => n % 2 !== 0).map((n) => n ** 3);

仔细看上面这段代码,你就会发现

如果我们首先使用过滤器,然后在排序,这样执行就能提高效率

numbers.filter((n) => n % 2 !== 0).sort((a, b) => a - b).map((n) => n ** 3);

三、建议这里使用reduce方法

你写的代码一定要让大家看的懂,代码要简洁,然而,有些方法它就出于这个目的创造的,如果你又不用,那就太可惜了,比如reduce方法。 举个例子,我们先从接口中拉出一段数据,然后对数据内容进行分类处理,像下面代码这样

fetch("https://jsonplaceholder.typicode.com/todos/").then(res=>res.json()).then(todos=>{// using Mapconst todosForUserMap = {};todos.forEach(todo=>{if (todosForUserMap[todo.userId]){todosForUserMap[todo.userId].push(todo);  }else{todosForUserMap[todo.userId] = [todo];}  })console.log(todosForUserMap)})

我看到大多数前端开发人员都会使用forEach方法或者错误的使用map方法去处理,相比之下,实际上这里特别适合使用reduce方法

看起来会更清晰而且更容易理解

fetch("https://jsonplaceholder.typicode.com/todos/").then(res=>res.json()).then(todos=>{// using Mapconst todosForUserMap = todos.reduce((accumulator, todo)=>{if (accumulator[todo.userId]) accumulator[todo.userId].push(todo);if (!accumulator[todo.userId]) accumulator[todo.userId] = [todo];return accumulator;},{})console.log(todosForUserMap)})

四、建议使用原生JavaScript类

上面这张很清晰明了的拆解了URL的每一部分

关于页面的URL我们可以组装也可以拆卸,这里说一下URL各部分的组装问题,你现在或者曾经肯定处理过URL拼接的问题,代码可能是这么写的

function getUrl(param){const { category, limit, userId } = param;const baseURL = "https://fakestoreapi.com/products";const limtParams = limit ? `limit=${Number(limit)}` : '';const userIdParams = limit ? `userId=${Number(userId)}` : '';return `${baseURL}${category ? `/category/${category}?` : ""}${limtParams}&${userIdParams}`;    
}

这样写虽然能够实现,但是代码看起来很混乱,很可能会被破坏,并且每次都需要你在最后添加一些规则,添加一些其他参数。 比如,你可能忘记添加/或者&符号就会导致错误,下面看看原生类怎么实现的,可以对比一下两者区别

function constructURL(param) {const { category, limit, userId } = param;const baseURL = "https://fakestoreapi.com/products";const url = new URL(baseURL);const params = new URLSearchParams();if (category) url.pathname += `/category/${category}`;if (limit) params.append('limit', Number(limit).toString());if (userId) params.append('userId', Number(userId).toString());url.search = params.toString();return url.toString();
}

这样看来,在处理URL组装问题上是不是可以考虑使用原生类了?

五、建议使用生成器

提到生成器,大家可能只是听过,或者知道怎么使用,而实际项目中很少去用。实际上它有很多使用场景。 使用生成器能够节省很多代码,代码也非常清晰。如,进行异步操作或者按需循环或者按需加载时。

看这段代码:

async function *fetchProducts(){while (true){const productUrl = "https://fakestoreapi.com/products?limit=2";const res = await fetch(productUrl)const data = await res.json()yield data;}
}async function main() {const itr = fetchProducts();console.log( await itr.next() );
}

上面代码中main函数,可以根据用户交互或者其它技巧来调用。因为这里不希望无限加载。

总结

好了,就说这几点,日常工作中,希望大家都写出高质量的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/186386.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL之 InnoDB逻辑存储结构

InnoDB逻辑存储结构 InnoDB将所有数据都存放在表空间中,表空间又由段(segment)、区(extent)、页(page)组成。InnoDB存储引擎的逻辑存储结构大致如下图。下面我们就一个个来看看。 页&#xff08…

Vue3中快速Diff算法

在Vue3中,快速Diff算法主要用于优化虚拟DOM的更新过程,减少不必要的DOM操作,提高性能。以下是对Vue3源码中快速Diff算法的解读: 首先,我们需要引入Vue3的相关包: import { reactive, toRefs, watch } fro…

f-string字符串格式化方法

f-string f-string是一种在Python3.6版本中引入的新的字符串格式化方法。它允许在字符串中插入变量值或表达式的计算结果,使用一种简单的、直观的语法。 f-string的格式为f"字符串 {表达式/变量}",其中大括号 {} 内可以是一个变量名、一个表…

[MTK]安卓8 ADB执行ota升级

需求 adb 推送update.zip进行安卓的OTA升级 环境 平台:mtk SDK:Android 8 命令方式 需要root adb root adb remount adb push update.zip /data/media/0/ adb shell uncrypt /data/media/0/update.zip /cache/recovery/block.map adb shell echo /data/media/0/update.zi…

智慧配电间(配电室智能监控)

智慧配电间是一种应用物联网、云计算、大数据等先进技术,对配电室进行智能化改造和升级,依托电易云-智慧电力物联网,实现电力设备的实时监控、智能控制和远程管理的解决方案。以下是智慧配电间的主要功能和特点: 实时监控与数据分…

【数组】-Lc1-两数之和

写在前面 最近想复习一下数据结构与算法相关的内容,找一些题来做一做。如有更好思路,欢迎指正。 目录 写在前面一、场景描述二、具体步骤1.环境说明2.代码 写在后面 一、场景描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找…

Python print函数的使用

Python中print函数的完整使用方法如下: print(*objects, sep , end\n, filesys.stdout, flushFalse)objects:这是print函数的主要输出内容,可以是一个或多个对象,如字符串、数字、变量等。当传入多个对象时,print函数…

特殊符号+彩色表情符号大全

特殊符号彩色表情符号大全 1、常用符号2、特殊符号3、编号序号4、数学符号5、爱心符号6、标点符号7、单位符号8、货币符号9、箭头符号(含推导&转换符号)10、符号图案11、希腊字母12、俄语字母13、汉语拼音14、中文字符15、日文符号16、制表符号17、皇…

Python与GPU编程快速入门(六)

文章目录 8、常量内存(Constant Memory)9、并发访问GPU9.1 在同一GPU上同时执行两个内核9.2 Stream同步9.3 使用流和事件测量执行时间8、常量内存(Constant Memory) 常量内存是只读缓存,其内容可以广播到块中的多个线程。 在常量内存中分配的变量需要使用特殊的__constan…

Mysql 效率优化

MySQL 是一种开源的关系型数据库管理系统,常用于 Web 应用程序的数据存储。在应用程序的开发和运维过程中,MySQL 的性能和效率往往是需要重点关注的问题。以下是一些 MySQL 的效率优化技巧: 优化 SQL 语句:合理设计 SQL 查询语句可…

中式言情短剧APP力压TikTok荣登美国下载榜一!外国人也难逃“霸总爱上我”的狗血剧?

开局退婚、豪门恩怨、霸道总裁爱上我……这些由中国团队拍摄、外国演员出演的竖屏霸总短剧,正在海外收割市场。 01 ReelShort力压TikTok冲上美国榜一 TKFFF获悉,国内数字出版企业中文在线旗下短剧App ReelShort日前力压TikTok冲上美国iOS娱乐榜第1名&…

[Matlab有限元分析] 2.杆单元有限元分析

1. 一维杆单元有限元分析程序 一维刚单元的局部坐标系(单元坐标系)与全局坐标系相同。 1.1 线性杆单元 如图所示是一个杆单元,由两个节点i和j,局部坐标系的X轴沿着杆的方向,由i节点指向j节点,每个节点有…

唯品会年度特卖大会㊙内购清单㊙

唯品会年度特卖大会㊙内购清单㊙ 内部员工亲友专享,实实在在省钱,❌抢完不补! 今晚8点开抢,提前收藏>> https://t.vip.com/Im3KlTnDSJ8 2023年唯品会年度特卖大会热门会场推荐 1.唯品会年度特卖大会 限时加码!瓜分百万津贴!抢海量…

【软件测试】白盒测试和黑盒测试

一、软件测试基本分类 一般地,我们将软件测试活动分为以下几类:黑盒测试、白盒测试、静态测试、动态测试、手动测试、自动测试等等。 黑盒测试 黑盒测试又叫功能测试、数据驱动测试或给予需求规格说明书的功能测试。这种测试注重于测试软件的功能性需…

什么是木马

木马 1. 定义2. 木马的特征3. 木马攻击流程4. 常见木马类型5. 如何防御木马 1. 定义 木马一名来源于古希腊特洛伊战争中著名的“木马计”,指可以非法控制计算机,或在他人计算机中从事秘密活动的恶意软件。 木马通过伪装成正常软件被下载到用户主机&…

【laBVIEW学习】4.声音播放,自定义图标,滚动条设置

一。声音播放(报错,未实现) 1.报错4810 2.解决方法: 暂时未解决。 二。图片修改 1.目标:灯泡---》自定义灯泡 2.步骤: 1.右键点击--》自定义运行 表示可以制作自定义类型 2.右键--》打开自定义类型 这样就…

Python streamlit指南,构建令人惊叹的可视化Web界面!

更多资料获取 📚 个人网站:ipengtao.com 在当今数据驱动的世界中,构建交互式、美观且高效的数据可视化应用变得至关重要。而Streamlit,作为Python生态系统中为开发者提供了轻松创建Web应用的利器。 本文将深入探讨Streamlit的方…

一次显著的性能提升,从8s到0.7s

前言 最近我在公司优化了一些慢查询SQL,积累了一些SQL调优的实战经验。 我之前写过一些SQL优化相关的文章《聊聊SQL优化的15个小技巧》和《explain | 索引优化的这把绝世好剑,你真的会用吗?》,在全网广受好评。 这篇文章从实战…

Oracle数据库连接,TNS描述符与连接字符串

前言:在现代应用程序开发中,与数据库建立可靠、高效的连接是至关重要的一环。在Oracle数据库中,Transparent Network Substrate(TNS)提供了一种强大的网络服务,使得客户端能够通过逻辑服务名连接到数据库&a…

Intellij IDEA 的安装和使用以及配置

IDE有很多种,常见的Eclipse、MyEclipse、Intellij IDEA、JBuilder、NetBeans等。但是这些IDE中目前比较火的是Intellij IDEA(以下简称IDEA),被众多Java程序员视为最好用的Java集成开发环境,今天的主题就是IDEA为开发工…